PKUWilliamYang commited on
Commit
983684c
·
1 Parent(s): ff1b8c8
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. app.py +267 -0
  2. packages.txt +4 -0
  3. requirements.txt +7 -0
  4. vtoonify/LICENSE.md +12 -0
  5. vtoonify/data/077436.jpg +0 -0
  6. vtoonify/data/pexels-andrea-piacquadio-733872.jpg +0 -0
  7. vtoonify/model/__init__.py +0 -0
  8. vtoonify/model/bisenet/LICENSE +21 -0
  9. vtoonify/model/bisenet/README.md +68 -0
  10. vtoonify/model/bisenet/model.py +283 -0
  11. vtoonify/model/bisenet/resnet.py +109 -0
  12. vtoonify/model/dualstylegan.py +203 -0
  13. vtoonify/model/encoder/__init__.py +0 -0
  14. vtoonify/model/encoder/align_all_parallel.py +217 -0
  15. vtoonify/model/encoder/criteria/id_loss.py +33 -0
  16. vtoonify/model/encoder/encoders/__init__.py +0 -0
  17. vtoonify/model/encoder/encoders/helpers.py +119 -0
  18. vtoonify/model/encoder/encoders/model_irse.py +84 -0
  19. vtoonify/model/encoder/encoders/psp_encoders.py +186 -0
  20. vtoonify/model/encoder/psp.py +125 -0
  21. vtoonify/model/encoder/readme.md +9 -0
  22. vtoonify/model/raft/LICENSE +29 -0
  23. vtoonify/model/raft/RAFT.png +0 -0
  24. vtoonify/model/raft/README.md +80 -0
  25. vtoonify/model/raft/alt_cuda_corr/correlation.cpp +54 -0
  26. vtoonify/model/raft/alt_cuda_corr/correlation_kernel.cu +324 -0
  27. vtoonify/model/raft/alt_cuda_corr/setup.py +15 -0
  28. vtoonify/model/raft/chairs_split.txt +22872 -0
  29. vtoonify/model/raft/core/__init__.py +0 -0
  30. vtoonify/model/raft/core/corr.py +91 -0
  31. vtoonify/model/raft/core/datasets.py +235 -0
  32. vtoonify/model/raft/core/extractor.py +267 -0
  33. vtoonify/model/raft/core/raft.py +144 -0
  34. vtoonify/model/raft/core/update.py +139 -0
  35. vtoonify/model/raft/core/utils/__init__.py +0 -0
  36. vtoonify/model/raft/core/utils/augmentor.py +246 -0
  37. vtoonify/model/raft/core/utils/flow_viz.py +132 -0
  38. vtoonify/model/raft/core/utils/frame_utils.py +137 -0
  39. vtoonify/model/raft/core/utils/utils.py +82 -0
  40. vtoonify/model/raft/demo.py +75 -0
  41. vtoonify/model/raft/download_models.sh +3 -0
  42. vtoonify/model/raft/evaluate.py +197 -0
  43. vtoonify/model/raft/train.py +247 -0
  44. vtoonify/model/raft/train_mixed.sh +6 -0
  45. vtoonify/model/raft/train_standard.sh +6 -0
  46. vtoonify/model/simple_augment.py +468 -0
  47. vtoonify/model/stylegan/__init__.py +0 -0
  48. vtoonify/model/stylegan/dataset.py +40 -0
  49. vtoonify/model/stylegan/distributed.py +126 -0
  50. vtoonify/model/stylegan/lpips/__init__.py +161 -0
app.py ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import pathlib
7
+
8
+ import gradio as gr
9
+
10
+ from vtoonify_model import Model
11
+
12
+ DESCRIPTION = '''
13
+ <div align=center>
14
+ <h1 style="font-weight: 900; margin-bottom: 7px;">
15
+ Portrait Style Transfer with <a href="https://github.com/williamyang1991/VToonify">VToonify</a>
16
+ </h1>
17
+ <video id="video" width=50% controls="" preload="none" poster="https://repository-images.githubusercontent.com/534480768/53715b0f-a2df-4daa-969c-0e74c102d339">
18
+ <source id="mp4" src="https://user-images.githubusercontent.com/18130694/189483939-0fc4a358-fb34-43cc-811a-b22adb820d57.mp4
19
+ " type="video/mp4">
20
+ </videos></div>
21
+ '''
22
+ FOOTER = '<div align=center><img id="visitor-badge" alt="visitor badge" src="https://visitor-badge.glitch.me/badge?page_id=gradio-blocks.vtoonify" /></div>'
23
+
24
+ ARTICLE = r"""
25
+ If VToonify is helpful, please help to ⭐ the <a href='https://github.com/williamyang1991/VToonify' target='_blank'>Github Repo</a>. Thanks!
26
+ [![GitHub Stars](https://img.shields.io/github/stars/sczhou/CodeFormer?style=social)](https://github.com/williamyang1991/VToonify)
27
+ ---
28
+ 📝 **Citation**
29
+ If our work is useful for your research, please consider citing:
30
+ ```bibtex
31
+ @article{yang2022Vtoonify,
32
+ title={VToonify: Controllable High-Resolution Portrait Video Style Transfer},
33
+ author={Yang, Shuai and Jiang, Liming and Liu, Ziwei and Loy, Chen Change},
34
+ journal={ACM Transactions on Graphics (TOG)},
35
+ volume={41},
36
+ number={6},
37
+ articleno={203},
38
+ pages={1--15},
39
+ year={2022},
40
+ publisher={ACM New York, NY, USA},
41
+ doi={10.1145/3550454.3555437},
42
+ }
43
+ ```
44
+ 📋 **License**
45
+ This project is licensed under <a rel="license" href="https://github.com/williamyang1991/VToonify/blob/main/LICENSE.md">S-Lab License 1.0</a>.
46
+ Redistribution and use for non-commercial purposes should follow this license.
47
+ 📧 **Contact**
48
+ If you have any questions, please feel free to reach me out at <b>williamyang@pku.edu.cn</b>.
49
+ """
50
+
51
+ def update_slider(choice: str) -> dict:
52
+ if type(choice) == str and choice.endswith('-d'):
53
+ return gr.Slider.update(maximum=1, minimum=0, value=0.5)
54
+ else:
55
+ return gr.Slider.update(maximum=0.5, minimum=0.5, value=0.5)
56
+
57
+ def set_example_image(example: list) -> dict:
58
+ return gr.Image.update(value=example[0])
59
+
60
+ def set_example_video(example: list) -> dict:
61
+ return gr.Video.update(value=example[0]),
62
+
63
+ sample_video = ['./vtoonify/data/529.mp4', './vtoonify/data/pexels-anthony-shkraba-7525601.mp4']
64
+ sample_vid = gr.Video(label='Video file') #for displaying the example
65
+ example_videos = gr.components.Dataset(components=[sample_vid], samples=[[path] for path in sample_video], type='values', label='Video Examples')
66
+
67
+ def main():
68
+ args = parse_args()
69
+ model = Model(device=args.device)
70
+
71
+ with gr.Blocks(theme=args.theme, css='style.css') as demo:
72
+
73
+ gr.Markdown(DESCRIPTION)
74
+
75
+ with gr.Box():
76
+ gr.Markdown('''## Step 1(Select Style)
77
+ - Select **Style Type**.
78
+ - Types with `-d` means it supports style degree adjustment.
79
+ - Types without `-d` usually has better toonification quality.
80
+
81
+ ''')
82
+ with gr.Row():
83
+ with gr.Column():
84
+ gr.Markdown('''Select Style Type''')
85
+ with gr.Row():
86
+ style_type = gr.Radio(label='Style Type',
87
+ choices=['cartoon1','cartoon1-d','cartoon2-d','cartoon3-d',
88
+ 'cartoon4','cartoon4-d','cartoon5-d','comic1-d',
89
+ 'comic2-d','comic3-d', 'arcane1','arcane1-d','arcane2', 'arcane2-d',
90
+ 'caricature1','caricature2','pixar','pixar-d'
91
+ ]
92
+ )
93
+ exstyle = gr.Variable()
94
+ with gr.Row():
95
+ loadmodel_button = gr.Button('Load Model')
96
+ with gr.Row():
97
+ load_info = gr.Textbox(label='Process Information', interactive=False, value='No model loaded.')
98
+ with gr.Column():
99
+ gr.Markdown('''Reference Styles
100
+ ![example](https://raw.githubusercontent.com/williamyang1991/tmpfile/master/vtoonify/style.jpg)''')
101
+
102
+
103
+ with gr.Box():
104
+ gr.Markdown('''## Step 2 (Preprocess Input Image / Video)
105
+ - Drop an image/video containing a near-frontal face to the **Input Image**/**Input Video.
106
+ - If there are multiple faces, hit the Edit button in the upper right corner and crop the source beforehand.
107
+ - Hit the **Rescale Image**/ **Rescale First Frame** button.
108
+ - The final image result will be based on this **Rescaled Face**.
109
+ - Use padding parameters to adjust the background space.
110
+ - For video input, further hit the **Rescale Video** button.
111
+ - The final video result will be based on this **Rescaled Video**.
112
+
113
+ ''')
114
+ with gr.Row():
115
+ with gr.Box():
116
+ with gr.Column():
117
+ gr.Markdown('''Choose the padding parameters.
118
+ ![example](https://raw.githubusercontent.com/williamyang1991/tmpfile/master/vtoonify/rescale.jpg)''')
119
+ with gr.Row():
120
+ top = gr.Slider(128,
121
+ 320,
122
+ value=200,
123
+ step=8,
124
+ label='top')
125
+ with gr.Row():
126
+ bottom = gr.Slider(128,
127
+ 320,
128
+ value=200,
129
+ step=8,
130
+ label='bottom')
131
+ with gr.Row():
132
+ left = gr.Slider(128,
133
+ 320,
134
+ value=200,
135
+ step=8,
136
+ label='left')
137
+ with gr.Row():
138
+ right = gr.Slider(128,
139
+ 320,
140
+ value=200,
141
+ step=8,
142
+ label='right')
143
+ with gr.Box():
144
+ with gr.Column():
145
+ gr.Markdown('''Input''')
146
+ with gr.Row():
147
+ input_image = gr.Image(label='Input Image',
148
+ type='filepath')
149
+ with gr.Row():
150
+ preprocess_image_button = gr.Button('Rescale Image')
151
+ with gr.Row():
152
+ input_video = gr.Video(label='Input Video',
153
+ mirror_webcam=False,
154
+ type='filepath')
155
+ with gr.Row():
156
+ preprocess_video0_button = gr.Button('Rescale First Frame')
157
+ preprocess_video1_button = gr.Button('Rescale Video')
158
+
159
+ with gr.Box():
160
+ with gr.Column():
161
+ gr.Markdown('''View''')
162
+ with gr.Row():
163
+ input_info = gr.Textbox(label='Process Information', interactive=False, value='n.a.')
164
+ with gr.Row():
165
+ aligned_face = gr.Image(label='Rescaled Face',
166
+ type='numpy',
167
+ interactive=False)
168
+ instyle = gr.Variable()
169
+ with gr.Row():
170
+ aligned_video = gr.Video(label='Rescaled Video',
171
+ type='mp4',
172
+ interactive=False)
173
+ with gr.Row():
174
+ with gr.Column():
175
+ paths = ['./vtoonify/data/077436.jpg', './vtoonify/data/pexels-andrea-piacquadio-733872.jpg']
176
+ example_images = gr.Dataset(components=[input_image],
177
+ samples=[[path] for path in paths],
178
+ label='Image Examples')
179
+ with gr.Column():
180
+ #example_videos = gr.Dataset(components=[input_video], samples=[['./vtoonify/data/529.mp4']], type='values')
181
+ #to render video example on mouse hover/click
182
+ example_videos.render()
183
+ #to load sample video into input_video upon clicking on it
184
+ def load_examples(video):
185
+ print("****** inside load_example() ******")
186
+ print("in_video is : ", video[0])
187
+ return video[0]
188
+
189
+ example_videos.click(load_examples, example_videos, input_video)
190
+
191
+ with gr.Box():
192
+ gr.Markdown('''## Step 3 (Generate Style Transferred Image/Video)''')
193
+ with gr.Row():
194
+ with gr.Column():
195
+ gr.Markdown('''
196
+
197
+ - Adjust **Style Degree**.
198
+ - For image, hit **Toonify!** to toonify **Rescaled Face**.
199
+ - For video, hit e **VToonify!** to toonify **Rescaled Video**.
200
+ ''')
201
+ style_degree = gr.Slider(0,
202
+ 1,
203
+ value=0.5,
204
+ step=0.05,
205
+ label='Style Degree')
206
+ with gr.Column():
207
+ gr.Markdown('''![example](https://raw.githubusercontent.com/williamyang1991/tmpfile/master/vtoonify/degree.jpg)
208
+ ''')
209
+ with gr.Row():
210
+ with gr.Column():
211
+ with gr.Row():
212
+ result_face = gr.Image(label='Result Image',
213
+ type='numpy',
214
+ interactive=False)
215
+ with gr.Row():
216
+ toonify_button = gr.Button('Toonify!')
217
+ with gr.Column():
218
+ with gr.Row():
219
+ result_video = gr.Video(label='Result Video',
220
+ type='mp4',
221
+ interactive=False)
222
+ with gr.Row():
223
+ vtoonify_button = gr.Button('VToonify!')
224
+
225
+ gr.Markdown(ARTICLE)
226
+ gr.Markdown(FOOTER)
227
+
228
+ loadmodel_button.click(fn=model.load_model,
229
+ inputs=[style_type],
230
+ outputs=[exstyle, load_info])
231
+
232
+
233
+ style_type.change(fn=update_slider,
234
+ inputs=style_type,
235
+ outputs=style_degree)
236
+
237
+ preprocess_image_button.click(fn=model.detect_and_align_image,
238
+ inputs=[input_image, top, bottom, left, right],
239
+ outputs=[aligned_face, instyle, input_info])
240
+ preprocess_video0_button.click(fn=model.detect_and_align_video,
241
+ inputs=[input_video, top, bottom, left, right],
242
+ outputs=[aligned_face, instyle, input_info])
243
+ preprocess_video1_button.click(fn=model.detect_and_align_full_video,
244
+ inputs=[input_video, top, bottom, left, right],
245
+ outputs=[aligned_video, instyle, input_info])
246
+
247
+ toonify_button.click(fn=model.image_toonify,
248
+ inputs=[aligned_face, instyle, exstyle, style_degree],
249
+ outputs=[result_face])
250
+ vtoonify_button.click(fn=model.video_tooniy,
251
+ inputs=[aligned_video, instyle, exstyle, style_degree],
252
+ outputs=[result_video])
253
+
254
+
255
+ example_images.click(fn=set_example_image,
256
+ inputs=example_images,
257
+ outputs=example_images.components)
258
+
259
+ demo.launch(
260
+ enable_queue=args.enable_queue,
261
+ server_port=args.port,
262
+ share=args.share,
263
+ )
264
+
265
+
266
+ if __name__ == '__main__':
267
+ main()
packages.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ bzip2
2
+ cmake
3
+ ninja-build
4
+
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ dlib==19.23.0
2
+ numpy==1.22.3
3
+ opencv-python-headless==4.5.5.62
4
+ Pillow==9.0.1
5
+ scipy==1.8.0
6
+ torch==1.11.0
7
+ torchvision==0.12.0
vtoonify/LICENSE.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # S-Lab License 1.0
2
+
3
+ Copyright 2022 S-Lab
4
+
5
+ Redistribution and use for non-commercial purpose in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\
9
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10
+ 4. In the event that redistribution and/or use for commercial purpose in source or binary forms, with or without modification is required, please contact the contributor(s) of the work.
11
+
12
+
vtoonify/data/077436.jpg ADDED
vtoonify/data/pexels-andrea-piacquadio-733872.jpg ADDED
vtoonify/model/__init__.py ADDED
File without changes
vtoonify/model/bisenet/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2019 zll
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
vtoonify/model/bisenet/README.md ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # face-parsing.PyTorch
2
+
3
+ <p align="center">
4
+ <a href="https://github.com/zllrunning/face-parsing.PyTorch">
5
+ <img class="page-image" src="https://github.com/zllrunning/face-parsing.PyTorch/blob/master/6.jpg" >
6
+ </a>
7
+ </p>
8
+
9
+ ### Contents
10
+ - [Training](#training)
11
+ - [Demo](#Demo)
12
+ - [References](#references)
13
+
14
+ ## Training
15
+
16
+ 1. Prepare training data:
17
+ -- download [CelebAMask-HQ dataset](https://github.com/switchablenorms/CelebAMask-HQ)
18
+
19
+ -- change file path in the `prepropess_data.py` and run
20
+ ```Shell
21
+ python prepropess_data.py
22
+ ```
23
+
24
+ 2. Train the model using CelebAMask-HQ dataset:
25
+ Just run the train script:
26
+ ```
27
+ $ CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 train.py
28
+ ```
29
+
30
+ If you do not wish to train the model, you can download [our pre-trained model](https://drive.google.com/open?id=154JgKpzCPW82qINcVieuPH3fZ2e0P812) and save it in `res/cp`.
31
+
32
+
33
+ ## Demo
34
+ 1. Evaluate the trained model using:
35
+ ```Shell
36
+ # evaluate using GPU
37
+ python test.py
38
+ ```
39
+
40
+ ## Face makeup using parsing maps
41
+ [**face-makeup.PyTorch**](https://github.com/zllrunning/face-makeup.PyTorch)
42
+ <table>
43
+
44
+ <tr>
45
+ <th>&nbsp;</th>
46
+ <th>Hair</th>
47
+ <th>Lip</th>
48
+ </tr>
49
+
50
+ <!-- Line 1: Original Input -->
51
+ <tr>
52
+ <td><em>Original Input</em></td>
53
+ <td><img src="makeup/116_ori.png" height="256" width="256" alt="Original Input"></td>
54
+ <td><img src="makeup/116_lip_ori.png" height="256" width="256" alt="Original Input"></td>
55
+ </tr>
56
+
57
+ <!-- Line 3: Color -->
58
+ <tr>
59
+ <td>Color</td>
60
+ <td><img src="makeup/116_1.png" height="256" width="256" alt="Color"></td>
61
+ <td><img src="makeup/116_3.png" height="256" width="256" alt="Color"></td>
62
+ </tr>
63
+
64
+ </table>
65
+
66
+
67
+ ## References
68
+ - [BiSeNet](https://github.com/CoinCheung/BiSeNet)
vtoonify/model/bisenet/model.py ADDED
@@ -0,0 +1,283 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/python
2
+ # -*- encoding: utf-8 -*-
3
+
4
+
5
+ import torch
6
+ import torch.nn as nn
7
+ import torch.nn.functional as F
8
+ import torchvision
9
+
10
+ from model.bisenet.resnet import Resnet18
11
+ # from modules.bn import InPlaceABNSync as BatchNorm2d
12
+
13
+
14
+ class ConvBNReLU(nn.Module):
15
+ def __init__(self, in_chan, out_chan, ks=3, stride=1, padding=1, *args, **kwargs):
16
+ super(ConvBNReLU, self).__init__()
17
+ self.conv = nn.Conv2d(in_chan,
18
+ out_chan,
19
+ kernel_size = ks,
20
+ stride = stride,
21
+ padding = padding,
22
+ bias = False)
23
+ self.bn = nn.BatchNorm2d(out_chan)
24
+ self.init_weight()
25
+
26
+ def forward(self, x):
27
+ x = self.conv(x)
28
+ x = F.relu(self.bn(x))
29
+ return x
30
+
31
+ def init_weight(self):
32
+ for ly in self.children():
33
+ if isinstance(ly, nn.Conv2d):
34
+ nn.init.kaiming_normal_(ly.weight, a=1)
35
+ if not ly.bias is None: nn.init.constant_(ly.bias, 0)
36
+
37
+ class BiSeNetOutput(nn.Module):
38
+ def __init__(self, in_chan, mid_chan, n_classes, *args, **kwargs):
39
+ super(BiSeNetOutput, self).__init__()
40
+ self.conv = ConvBNReLU(in_chan, mid_chan, ks=3, stride=1, padding=1)
41
+ self.conv_out = nn.Conv2d(mid_chan, n_classes, kernel_size=1, bias=False)
42
+ self.init_weight()
43
+
44
+ def forward(self, x):
45
+ x = self.conv(x)
46
+ x = self.conv_out(x)
47
+ return x
48
+
49
+ def init_weight(self):
50
+ for ly in self.children():
51
+ if isinstance(ly, nn.Conv2d):
52
+ nn.init.kaiming_normal_(ly.weight, a=1)
53
+ if not ly.bias is None: nn.init.constant_(ly.bias, 0)
54
+
55
+ def get_params(self):
56
+ wd_params, nowd_params = [], []
57
+ for name, module in self.named_modules():
58
+ if isinstance(module, nn.Linear) or isinstance(module, nn.Conv2d):
59
+ wd_params.append(module.weight)
60
+ if not module.bias is None:
61
+ nowd_params.append(module.bias)
62
+ elif isinstance(module, nn.BatchNorm2d):
63
+ nowd_params += list(module.parameters())
64
+ return wd_params, nowd_params
65
+
66
+
67
+ class AttentionRefinementModule(nn.Module):
68
+ def __init__(self, in_chan, out_chan, *args, **kwargs):
69
+ super(AttentionRefinementModule, self).__init__()
70
+ self.conv = ConvBNReLU(in_chan, out_chan, ks=3, stride=1, padding=1)
71
+ self.conv_atten = nn.Conv2d(out_chan, out_chan, kernel_size= 1, bias=False)
72
+ self.bn_atten = nn.BatchNorm2d(out_chan)
73
+ self.sigmoid_atten = nn.Sigmoid()
74
+ self.init_weight()
75
+
76
+ def forward(self, x):
77
+ feat = self.conv(x)
78
+ atten = F.avg_pool2d(feat, feat.size()[2:])
79
+ atten = self.conv_atten(atten)
80
+ atten = self.bn_atten(atten)
81
+ atten = self.sigmoid_atten(atten)
82
+ out = torch.mul(feat, atten)
83
+ return out
84
+
85
+ def init_weight(self):
86
+ for ly in self.children():
87
+ if isinstance(ly, nn.Conv2d):
88
+ nn.init.kaiming_normal_(ly.weight, a=1)
89
+ if not ly.bias is None: nn.init.constant_(ly.bias, 0)
90
+
91
+
92
+ class ContextPath(nn.Module):
93
+ def __init__(self, *args, **kwargs):
94
+ super(ContextPath, self).__init__()
95
+ self.resnet = Resnet18()
96
+ self.arm16 = AttentionRefinementModule(256, 128)
97
+ self.arm32 = AttentionRefinementModule(512, 128)
98
+ self.conv_head32 = ConvBNReLU(128, 128, ks=3, stride=1, padding=1)
99
+ self.conv_head16 = ConvBNReLU(128, 128, ks=3, stride=1, padding=1)
100
+ self.conv_avg = ConvBNReLU(512, 128, ks=1, stride=1, padding=0)
101
+
102
+ self.init_weight()
103
+
104
+ def forward(self, x):
105
+ H0, W0 = x.size()[2:]
106
+ feat8, feat16, feat32 = self.resnet(x)
107
+ H8, W8 = feat8.size()[2:]
108
+ H16, W16 = feat16.size()[2:]
109
+ H32, W32 = feat32.size()[2:]
110
+
111
+ avg = F.avg_pool2d(feat32, feat32.size()[2:])
112
+ avg = self.conv_avg(avg)
113
+ avg_up = F.interpolate(avg, (H32, W32), mode='nearest')
114
+
115
+ feat32_arm = self.arm32(feat32)
116
+ feat32_sum = feat32_arm + avg_up
117
+ feat32_up = F.interpolate(feat32_sum, (H16, W16), mode='nearest')
118
+ feat32_up = self.conv_head32(feat32_up)
119
+
120
+ feat16_arm = self.arm16(feat16)
121
+ feat16_sum = feat16_arm + feat32_up
122
+ feat16_up = F.interpolate(feat16_sum, (H8, W8), mode='nearest')
123
+ feat16_up = self.conv_head16(feat16_up)
124
+
125
+ return feat8, feat16_up, feat32_up # x8, x8, x16
126
+
127
+ def init_weight(self):
128
+ for ly in self.children():
129
+ if isinstance(ly, nn.Conv2d):
130
+ nn.init.kaiming_normal_(ly.weight, a=1)
131
+ if not ly.bias is None: nn.init.constant_(ly.bias, 0)
132
+
133
+ def get_params(self):
134
+ wd_params, nowd_params = [], []
135
+ for name, module in self.named_modules():
136
+ if isinstance(module, (nn.Linear, nn.Conv2d)):
137
+ wd_params.append(module.weight)
138
+ if not module.bias is None:
139
+ nowd_params.append(module.bias)
140
+ elif isinstance(module, nn.BatchNorm2d):
141
+ nowd_params += list(module.parameters())
142
+ return wd_params, nowd_params
143
+
144
+
145
+ ### This is not used, since I replace this with the resnet feature with the same size
146
+ class SpatialPath(nn.Module):
147
+ def __init__(self, *args, **kwargs):
148
+ super(SpatialPath, self).__init__()
149
+ self.conv1 = ConvBNReLU(3, 64, ks=7, stride=2, padding=3)
150
+ self.conv2 = ConvBNReLU(64, 64, ks=3, stride=2, padding=1)
151
+ self.conv3 = ConvBNReLU(64, 64, ks=3, stride=2, padding=1)
152
+ self.conv_out = ConvBNReLU(64, 128, ks=1, stride=1, padding=0)
153
+ self.init_weight()
154
+
155
+ def forward(self, x):
156
+ feat = self.conv1(x)
157
+ feat = self.conv2(feat)
158
+ feat = self.conv3(feat)
159
+ feat = self.conv_out(feat)
160
+ return feat
161
+
162
+ def init_weight(self):
163
+ for ly in self.children():
164
+ if isinstance(ly, nn.Conv2d):
165
+ nn.init.kaiming_normal_(ly.weight, a=1)
166
+ if not ly.bias is None: nn.init.constant_(ly.bias, 0)
167
+
168
+ def get_params(self):
169
+ wd_params, nowd_params = [], []
170
+ for name, module in self.named_modules():
171
+ if isinstance(module, nn.Linear) or isinstance(module, nn.Conv2d):
172
+ wd_params.append(module.weight)
173
+ if not module.bias is None:
174
+ nowd_params.append(module.bias)
175
+ elif isinstance(module, nn.BatchNorm2d):
176
+ nowd_params += list(module.parameters())
177
+ return wd_params, nowd_params
178
+
179
+
180
+ class FeatureFusionModule(nn.Module):
181
+ def __init__(self, in_chan, out_chan, *args, **kwargs):
182
+ super(FeatureFusionModule, self).__init__()
183
+ self.convblk = ConvBNReLU(in_chan, out_chan, ks=1, stride=1, padding=0)
184
+ self.conv1 = nn.Conv2d(out_chan,
185
+ out_chan//4,
186
+ kernel_size = 1,
187
+ stride = 1,
188
+ padding = 0,
189
+ bias = False)
190
+ self.conv2 = nn.Conv2d(out_chan//4,
191
+ out_chan,
192
+ kernel_size = 1,
193
+ stride = 1,
194
+ padding = 0,
195
+ bias = False)
196
+ self.relu = nn.ReLU(inplace=True)
197
+ self.sigmoid = nn.Sigmoid()
198
+ self.init_weight()
199
+
200
+ def forward(self, fsp, fcp):
201
+ fcat = torch.cat([fsp, fcp], dim=1)
202
+ feat = self.convblk(fcat)
203
+ atten = F.avg_pool2d(feat, feat.size()[2:])
204
+ atten = self.conv1(atten)
205
+ atten = self.relu(atten)
206
+ atten = self.conv2(atten)
207
+ atten = self.sigmoid(atten)
208
+ feat_atten = torch.mul(feat, atten)
209
+ feat_out = feat_atten + feat
210
+ return feat_out
211
+
212
+ def init_weight(self):
213
+ for ly in self.children():
214
+ if isinstance(ly, nn.Conv2d):
215
+ nn.init.kaiming_normal_(ly.weight, a=1)
216
+ if not ly.bias is None: nn.init.constant_(ly.bias, 0)
217
+
218
+ def get_params(self):
219
+ wd_params, nowd_params = [], []
220
+ for name, module in self.named_modules():
221
+ if isinstance(module, nn.Linear) or isinstance(module, nn.Conv2d):
222
+ wd_params.append(module.weight)
223
+ if not module.bias is None:
224
+ nowd_params.append(module.bias)
225
+ elif isinstance(module, nn.BatchNorm2d):
226
+ nowd_params += list(module.parameters())
227
+ return wd_params, nowd_params
228
+
229
+
230
+ class BiSeNet(nn.Module):
231
+ def __init__(self, n_classes, *args, **kwargs):
232
+ super(BiSeNet, self).__init__()
233
+ self.cp = ContextPath()
234
+ ## here self.sp is deleted
235
+ self.ffm = FeatureFusionModule(256, 256)
236
+ self.conv_out = BiSeNetOutput(256, 256, n_classes)
237
+ self.conv_out16 = BiSeNetOutput(128, 64, n_classes)
238
+ self.conv_out32 = BiSeNetOutput(128, 64, n_classes)
239
+ self.init_weight()
240
+
241
+ def forward(self, x):
242
+ H, W = x.size()[2:]
243
+ feat_res8, feat_cp8, feat_cp16 = self.cp(x) # here return res3b1 feature
244
+ feat_sp = feat_res8 # use res3b1 feature to replace spatial path feature
245
+ feat_fuse = self.ffm(feat_sp, feat_cp8)
246
+
247
+ feat_out = self.conv_out(feat_fuse)
248
+ feat_out16 = self.conv_out16(feat_cp8)
249
+ feat_out32 = self.conv_out32(feat_cp16)
250
+
251
+ feat_out = F.interpolate(feat_out, (H, W), mode='bilinear', align_corners=True)
252
+ feat_out16 = F.interpolate(feat_out16, (H, W), mode='bilinear', align_corners=True)
253
+ feat_out32 = F.interpolate(feat_out32, (H, W), mode='bilinear', align_corners=True)
254
+ return feat_out, feat_out16, feat_out32
255
+
256
+ def init_weight(self):
257
+ for ly in self.children():
258
+ if isinstance(ly, nn.Conv2d):
259
+ nn.init.kaiming_normal_(ly.weight, a=1)
260
+ if not ly.bias is None: nn.init.constant_(ly.bias, 0)
261
+
262
+ def get_params(self):
263
+ wd_params, nowd_params, lr_mul_wd_params, lr_mul_nowd_params = [], [], [], []
264
+ for name, child in self.named_children():
265
+ child_wd_params, child_nowd_params = child.get_params()
266
+ if isinstance(child, FeatureFusionModule) or isinstance(child, BiSeNetOutput):
267
+ lr_mul_wd_params += child_wd_params
268
+ lr_mul_nowd_params += child_nowd_params
269
+ else:
270
+ wd_params += child_wd_params
271
+ nowd_params += child_nowd_params
272
+ return wd_params, nowd_params, lr_mul_wd_params, lr_mul_nowd_params
273
+
274
+
275
+ if __name__ == "__main__":
276
+ net = BiSeNet(19)
277
+ net.cuda()
278
+ net.eval()
279
+ in_ten = torch.randn(16, 3, 640, 480).cuda()
280
+ out, out16, out32 = net(in_ten)
281
+ print(out.shape)
282
+
283
+ net.get_params()
vtoonify/model/bisenet/resnet.py ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/python
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ import torch
5
+ import torch.nn as nn
6
+ import torch.nn.functional as F
7
+ import torch.utils.model_zoo as modelzoo
8
+
9
+ # from modules.bn import InPlaceABNSync as BatchNorm2d
10
+
11
+ resnet18_url = 'https://download.pytorch.org/models/resnet18-5c106cde.pth'
12
+
13
+
14
+ def conv3x3(in_planes, out_planes, stride=1):
15
+ """3x3 convolution with padding"""
16
+ return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,
17
+ padding=1, bias=False)
18
+
19
+
20
+ class BasicBlock(nn.Module):
21
+ def __init__(self, in_chan, out_chan, stride=1):
22
+ super(BasicBlock, self).__init__()
23
+ self.conv1 = conv3x3(in_chan, out_chan, stride)
24
+ self.bn1 = nn.BatchNorm2d(out_chan)
25
+ self.conv2 = conv3x3(out_chan, out_chan)
26
+ self.bn2 = nn.BatchNorm2d(out_chan)
27
+ self.relu = nn.ReLU(inplace=True)
28
+ self.downsample = None
29
+ if in_chan != out_chan or stride != 1:
30
+ self.downsample = nn.Sequential(
31
+ nn.Conv2d(in_chan, out_chan,
32
+ kernel_size=1, stride=stride, bias=False),
33
+ nn.BatchNorm2d(out_chan),
34
+ )
35
+
36
+ def forward(self, x):
37
+ residual = self.conv1(x)
38
+ residual = F.relu(self.bn1(residual))
39
+ residual = self.conv2(residual)
40
+ residual = self.bn2(residual)
41
+
42
+ shortcut = x
43
+ if self.downsample is not None:
44
+ shortcut = self.downsample(x)
45
+
46
+ out = shortcut + residual
47
+ out = self.relu(out)
48
+ return out
49
+
50
+
51
+ def create_layer_basic(in_chan, out_chan, bnum, stride=1):
52
+ layers = [BasicBlock(in_chan, out_chan, stride=stride)]
53
+ for i in range(bnum-1):
54
+ layers.append(BasicBlock(out_chan, out_chan, stride=1))
55
+ return nn.Sequential(*layers)
56
+
57
+
58
+ class Resnet18(nn.Module):
59
+ def __init__(self):
60
+ super(Resnet18, self).__init__()
61
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,
62
+ bias=False)
63
+ self.bn1 = nn.BatchNorm2d(64)
64
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
65
+ self.layer1 = create_layer_basic(64, 64, bnum=2, stride=1)
66
+ self.layer2 = create_layer_basic(64, 128, bnum=2, stride=2)
67
+ self.layer3 = create_layer_basic(128, 256, bnum=2, stride=2)
68
+ self.layer4 = create_layer_basic(256, 512, bnum=2, stride=2)
69
+ self.init_weight()
70
+
71
+ def forward(self, x):
72
+ x = self.conv1(x)
73
+ x = F.relu(self.bn1(x))
74
+ x = self.maxpool(x)
75
+
76
+ x = self.layer1(x)
77
+ feat8 = self.layer2(x) # 1/8
78
+ feat16 = self.layer3(feat8) # 1/16
79
+ feat32 = self.layer4(feat16) # 1/32
80
+ return feat8, feat16, feat32
81
+
82
+ def init_weight(self):
83
+ state_dict = modelzoo.load_url(resnet18_url)
84
+ self_state_dict = self.state_dict()
85
+ for k, v in state_dict.items():
86
+ if 'fc' in k: continue
87
+ self_state_dict.update({k: v})
88
+ self.load_state_dict(self_state_dict)
89
+
90
+ def get_params(self):
91
+ wd_params, nowd_params = [], []
92
+ for name, module in self.named_modules():
93
+ if isinstance(module, (nn.Linear, nn.Conv2d)):
94
+ wd_params.append(module.weight)
95
+ if not module.bias is None:
96
+ nowd_params.append(module.bias)
97
+ elif isinstance(module, nn.BatchNorm2d):
98
+ nowd_params += list(module.parameters())
99
+ return wd_params, nowd_params
100
+
101
+
102
+ if __name__ == "__main__":
103
+ net = Resnet18()
104
+ x = torch.randn(16, 3, 224, 224)
105
+ out = net(x)
106
+ print(out[0].size())
107
+ print(out[1].size())
108
+ print(out[2].size())
109
+ net.get_params()
vtoonify/model/dualstylegan.py ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import random
2
+ import torch
3
+ from torch import nn
4
+ from model.stylegan.model import ConvLayer, PixelNorm, EqualLinear, Generator
5
+
6
+ class AdaptiveInstanceNorm(nn.Module):
7
+ def __init__(self, fin, style_dim=512):
8
+ super().__init__()
9
+
10
+ self.norm = nn.InstanceNorm2d(fin, affine=False)
11
+ self.style = nn.Linear(style_dim, fin * 2)
12
+
13
+ self.style.bias.data[:fin] = 1
14
+ self.style.bias.data[fin:] = 0
15
+
16
+ def forward(self, input, style):
17
+ style = self.style(style).unsqueeze(2).unsqueeze(3)
18
+ gamma, beta = style.chunk(2, 1)
19
+ out = self.norm(input)
20
+ out = gamma * out + beta
21
+ return out
22
+
23
+ # modulative residual blocks (ModRes)
24
+ class AdaResBlock(nn.Module):
25
+ def __init__(self, fin, style_dim=512, dilation=1): # modified
26
+ super().__init__()
27
+
28
+ self.conv = ConvLayer(fin, fin, 3, dilation=dilation) # modified
29
+ self.conv2 = ConvLayer(fin, fin, 3, dilation=dilation) # modified
30
+ self.norm = AdaptiveInstanceNorm(fin, style_dim)
31
+ self.norm2 = AdaptiveInstanceNorm(fin, style_dim)
32
+
33
+ # model initialization
34
+ # the convolution filters are set to values close to 0 to produce negligible residual features
35
+ self.conv[0].weight.data *= 0.01
36
+ self.conv2[0].weight.data *= 0.01
37
+
38
+ def forward(self, x, s, w=1):
39
+ skip = x
40
+ if w == 0:
41
+ return skip
42
+ out = self.conv(self.norm(x, s))
43
+ out = self.conv2(self.norm2(out, s))
44
+ out = out * w + skip
45
+ return out
46
+
47
+ class DualStyleGAN(nn.Module):
48
+ def __init__(self, size, style_dim, n_mlp, channel_multiplier=2, twoRes=True, res_index=6):
49
+ super().__init__()
50
+
51
+ layers = [PixelNorm()]
52
+ for i in range(n_mlp-6):
53
+ layers.append(EqualLinear(512, 512, lr_mul=0.01, activation="fused_lrelu"))
54
+ # color transform blocks T_c
55
+ self.style = nn.Sequential(*layers)
56
+ # StyleGAN2
57
+ self.generator = Generator(size, style_dim, n_mlp, channel_multiplier)
58
+ # The extrinsic style path
59
+ self.res = nn.ModuleList()
60
+ self.res_index = res_index//2 * 2
61
+ self.res.append(AdaResBlock(self.generator.channels[2 ** 2])) # for conv1
62
+ for i in range(3, self.generator.log_size + 1):
63
+ out_channel = self.generator.channels[2 ** i]
64
+ if i < 3 + self.res_index//2:
65
+ # ModRes
66
+ self.res.append(AdaResBlock(out_channel))
67
+ self.res.append(AdaResBlock(out_channel))
68
+ else:
69
+ # structure transform block T_s
70
+ self.res.append(EqualLinear(512, 512))
71
+ # FC layer is initialized with identity matrices, meaning no changes to the input latent code
72
+ self.res[-1].weight.data = torch.eye(512) * 512.0**0.5 + torch.randn(512, 512) * 0.01
73
+ self.res.append(EqualLinear(512, 512))
74
+ self.res[-1].weight.data = torch.eye(512) * 512.0**0.5 + torch.randn(512, 512) * 0.01
75
+ self.res.append(EqualLinear(512, 512)) # for to_rgb7
76
+ self.res[-1].weight.data = torch.eye(512) * 512.0**0.5 + torch.randn(512, 512) * 0.01
77
+ self.size = self.generator.size
78
+ self.style_dim = self.generator.style_dim
79
+ self.log_size = self.generator.log_size
80
+ self.num_layers = self.generator.num_layers
81
+ self.n_latent = self.generator.n_latent
82
+ self.channels = self.generator.channels
83
+
84
+ def forward(
85
+ self,
86
+ styles, # intrinsic style code
87
+ exstyles, # extrinsic style code
88
+ return_latents=False,
89
+ return_feat=False,
90
+ inject_index=None,
91
+ truncation=1,
92
+ truncation_latent=None,
93
+ input_is_latent=False,
94
+ noise=None,
95
+ randomize_noise=True,
96
+ z_plus_latent=False, # intrinsic style code is z+ or z
97
+ use_res=True, # whether to use the extrinsic style path
98
+ fuse_index=18, # layers > fuse_index do not use the extrinsic style path
99
+ interp_weights=[1]*18, # weight vector for style combination of two paths
100
+ ):
101
+
102
+ if not input_is_latent:
103
+ if not z_plus_latent:
104
+ styles = [self.generator.style(s) for s in styles]
105
+ else:
106
+ styles = [self.generator.style(s.reshape(s.shape[0]*s.shape[1], s.shape[2])).reshape(s.shape) for s in styles]
107
+
108
+ if noise is None:
109
+ if randomize_noise:
110
+ noise = [None] * self.generator.num_layers
111
+ else:
112
+ noise = [
113
+ getattr(self.generator.noises, f"noise_{i}") for i in range(self.generator.num_layers)
114
+ ]
115
+
116
+ if truncation < 1:
117
+ style_t = []
118
+
119
+ for style in styles:
120
+ style_t.append(
121
+ truncation_latent + truncation * (style - truncation_latent)
122
+ )
123
+
124
+ styles = style_t
125
+
126
+ if len(styles) < 2:
127
+ inject_index = self.generator.n_latent
128
+
129
+ if styles[0].ndim < 3:
130
+ latent = styles[0].unsqueeze(1).repeat(1, inject_index, 1)
131
+
132
+ else:
133
+ latent = styles[0]
134
+
135
+ else:
136
+ if inject_index is None:
137
+ inject_index = random.randint(1, self.generator.n_latent - 1)
138
+
139
+ if styles[0].ndim < 3:
140
+ latent = styles[0].unsqueeze(1).repeat(1, inject_index, 1)
141
+ latent2 = styles[1].unsqueeze(1).repeat(1, self.generator.n_latent - inject_index, 1)
142
+
143
+ latent = torch.cat([latent, latent2], 1)
144
+ else:
145
+ latent = torch.cat([styles[0][:,0:inject_index], styles[1][:,inject_index:]], 1)
146
+
147
+ if use_res:
148
+ if exstyles.ndim < 3:
149
+ resstyles = self.style(exstyles).unsqueeze(1).repeat(1, self.generator.n_latent, 1)
150
+ adastyles = exstyles.unsqueeze(1).repeat(1, self.generator.n_latent, 1)
151
+ else:
152
+ nB, nL, nD = exstyles.shape
153
+ resstyles = self.style(exstyles.reshape(nB*nL, nD)).reshape(nB, nL, nD)
154
+ adastyles = exstyles
155
+
156
+ out = self.generator.input(latent)
157
+ out = self.generator.conv1(out, latent[:, 0], noise=noise[0])
158
+ if use_res and fuse_index > 0:
159
+ out = self.res[0](out, resstyles[:, 0], interp_weights[0])
160
+
161
+ skip = self.generator.to_rgb1(out, latent[:, 1])
162
+ i = 1
163
+ for conv1, conv2, noise1, noise2, to_rgb in zip(
164
+ self.generator.convs[::2], self.generator.convs[1::2], noise[1::2], noise[2::2], self.generator.to_rgbs):
165
+ if use_res and fuse_index >= i and i > self.res_index:
166
+ out = conv1(out, interp_weights[i] * self.res[i](adastyles[:, i]) +
167
+ (1-interp_weights[i]) * latent[:, i], noise=noise1)
168
+ else:
169
+ out = conv1(out, latent[:, i], noise=noise1)
170
+ if use_res and fuse_index >= i and i <= self.res_index:
171
+ out = self.res[i](out, resstyles[:, i], interp_weights[i])
172
+ if use_res and fuse_index >= (i+1) and i > self.res_index:
173
+ out = conv2(out, interp_weights[i+1] * self.res[i+1](adastyles[:, i+1]) +
174
+ (1-interp_weights[i+1]) * latent[:, i+1], noise=noise2)
175
+ else:
176
+ out = conv2(out, latent[:, i + 1], noise=noise2)
177
+ if use_res and fuse_index >= (i+1) and i <= self.res_index:
178
+ out = self.res[i+1](out, resstyles[:, i+1], interp_weights[i+1])
179
+ if use_res and fuse_index >= (i+2) and i >= self.res_index-1:
180
+ skip = to_rgb(out, interp_weights[i+2] * self.res[i+2](adastyles[:, i+2]) +
181
+ (1-interp_weights[i+2]) * latent[:, i + 2], skip)
182
+ else:
183
+ skip = to_rgb(out, latent[:, i + 2], skip)
184
+ i += 2
185
+ if i > self.res_index and return_feat:
186
+ return out, skip
187
+
188
+ image = skip
189
+
190
+ if return_latents:
191
+ return image, latent
192
+
193
+ else:
194
+ return image, None
195
+
196
+ def make_noise(self):
197
+ return self.generator.make_noise()
198
+
199
+ def mean_latent(self, n_latent):
200
+ return self.generator.mean_latent(n_latent)
201
+
202
+ def get_latent(self, input):
203
+ return self.generator.style(input)
vtoonify/model/encoder/__init__.py ADDED
File without changes
vtoonify/model/encoder/align_all_parallel.py ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ brief: face alignment with FFHQ method (https://github.com/NVlabs/ffhq-dataset)
3
+ author: lzhbrian (https://lzhbrian.me)
4
+ date: 2020.1.5
5
+ note: code is heavily borrowed from
6
+ https://github.com/NVlabs/ffhq-dataset
7
+ http://dlib.net/face_landmark_detection.py.html
8
+
9
+ requirements:
10
+ apt install cmake
11
+ conda install Pillow numpy scipy
12
+ pip install dlib
13
+ # download face landmark model from:
14
+ # http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
15
+ """
16
+ from argparse import ArgumentParser
17
+ import time
18
+ import numpy as np
19
+ import PIL
20
+ import PIL.Image
21
+ import os
22
+ import scipy
23
+ import scipy.ndimage
24
+ import dlib
25
+ import multiprocessing as mp
26
+ import math
27
+
28
+ #from configs.paths_config import model_paths
29
+ SHAPE_PREDICTOR_PATH = 'shape_predictor_68_face_landmarks.dat'#model_paths["shape_predictor"]
30
+
31
+
32
+ def get_landmark(filepath, predictor):
33
+ """get landmark with dlib
34
+ :return: np.array shape=(68, 2)
35
+ """
36
+ detector = dlib.get_frontal_face_detector()
37
+ if type(filepath) == str:
38
+ img = dlib.load_rgb_image(filepath)
39
+ else:
40
+ img = filepath
41
+ dets = detector(img, 1)
42
+
43
+ if len(dets) == 0:
44
+ print('Error: no face detected!')
45
+ return None
46
+
47
+ shape = None
48
+ for k, d in enumerate(dets):
49
+ shape = predictor(img, d)
50
+
51
+ if shape is None:
52
+ print('Error: No face detected! If you are sure there are faces in your input, you may rerun the code several times until the face is detected. Sometimes the detector is unstable.')
53
+ t = list(shape.parts())
54
+ a = []
55
+ for tt in t:
56
+ a.append([tt.x, tt.y])
57
+ lm = np.array(a)
58
+ return lm
59
+
60
+
61
+ def align_face(filepath, predictor):
62
+ """
63
+ :param filepath: str
64
+ :return: PIL Image
65
+ """
66
+
67
+ lm = get_landmark(filepath, predictor)
68
+ if lm is None:
69
+ return None
70
+
71
+ lm_chin = lm[0: 17] # left-right
72
+ lm_eyebrow_left = lm[17: 22] # left-right
73
+ lm_eyebrow_right = lm[22: 27] # left-right
74
+ lm_nose = lm[27: 31] # top-down
75
+ lm_nostrils = lm[31: 36] # top-down
76
+ lm_eye_left = lm[36: 42] # left-clockwise
77
+ lm_eye_right = lm[42: 48] # left-clockwise
78
+ lm_mouth_outer = lm[48: 60] # left-clockwise
79
+ lm_mouth_inner = lm[60: 68] # left-clockwise
80
+
81
+ # Calculate auxiliary vectors.
82
+ eye_left = np.mean(lm_eye_left, axis=0)
83
+ eye_right = np.mean(lm_eye_right, axis=0)
84
+ eye_avg = (eye_left + eye_right) * 0.5
85
+ eye_to_eye = eye_right - eye_left
86
+ mouth_left = lm_mouth_outer[0]
87
+ mouth_right = lm_mouth_outer[6]
88
+ mouth_avg = (mouth_left + mouth_right) * 0.5
89
+ eye_to_mouth = mouth_avg - eye_avg
90
+
91
+ # Choose oriented crop rectangle.
92
+ x = eye_to_eye - np.flipud(eye_to_mouth) * [-1, 1]
93
+ x /= np.hypot(*x)
94
+ x *= max(np.hypot(*eye_to_eye) * 2.0, np.hypot(*eye_to_mouth) * 1.8)
95
+ y = np.flipud(x) * [-1, 1]
96
+ c = eye_avg + eye_to_mouth * 0.1
97
+ quad = np.stack([c - x - y, c - x + y, c + x + y, c + x - y])
98
+ qsize = np.hypot(*x) * 2
99
+
100
+ # read image
101
+ if type(filepath) == str:
102
+ img = PIL.Image.open(filepath)
103
+ else:
104
+ img = PIL.Image.fromarray(filepath)
105
+
106
+ output_size = 256
107
+ transform_size = 256
108
+ enable_padding = True
109
+
110
+ # Shrink.
111
+ shrink = int(np.floor(qsize / output_size * 0.5))
112
+ if shrink > 1:
113
+ rsize = (int(np.rint(float(img.size[0]) / shrink)), int(np.rint(float(img.size[1]) / shrink)))
114
+ img = img.resize(rsize, PIL.Image.ANTIALIAS)
115
+ quad /= shrink
116
+ qsize /= shrink
117
+
118
+ # Crop.
119
+ border = max(int(np.rint(qsize * 0.1)), 3)
120
+ crop = (int(np.floor(min(quad[:, 0]))), int(np.floor(min(quad[:, 1]))), int(np.ceil(max(quad[:, 0]))),
121
+ int(np.ceil(max(quad[:, 1]))))
122
+ crop = (max(crop[0] - border, 0), max(crop[1] - border, 0), min(crop[2] + border, img.size[0]),
123
+ min(crop[3] + border, img.size[1]))
124
+ if crop[2] - crop[0] < img.size[0] or crop[3] - crop[1] < img.size[1]:
125
+ img = img.crop(crop)
126
+ quad -= crop[0:2]
127
+
128
+ # Pad.
129
+ pad = (int(np.floor(min(quad[:, 0]))), int(np.floor(min(quad[:, 1]))), int(np.ceil(max(quad[:, 0]))),
130
+ int(np.ceil(max(quad[:, 1]))))
131
+ pad = (max(-pad[0] + border, 0), max(-pad[1] + border, 0), max(pad[2] - img.size[0] + border, 0),
132
+ max(pad[3] - img.size[1] + border, 0))
133
+ if enable_padding and max(pad) > border - 4:
134
+ pad = np.maximum(pad, int(np.rint(qsize * 0.3)))
135
+ img = np.pad(np.float32(img), ((pad[1], pad[3]), (pad[0], pad[2]), (0, 0)), 'reflect')
136
+ h, w, _ = img.shape
137
+ y, x, _ = np.ogrid[:h, :w, :1]
138
+ mask = np.maximum(1.0 - np.minimum(np.float32(x) / pad[0], np.float32(w - 1 - x) / pad[2]),
139
+ 1.0 - np.minimum(np.float32(y) / pad[1], np.float32(h - 1 - y) / pad[3]))
140
+ blur = qsize * 0.02
141
+ img += (scipy.ndimage.gaussian_filter(img, [blur, blur, 0]) - img) * np.clip(mask * 3.0 + 1.0, 0.0, 1.0)
142
+ img += (np.median(img, axis=(0, 1)) - img) * np.clip(mask, 0.0, 1.0)
143
+ img = PIL.Image.fromarray(np.uint8(np.clip(np.rint(img), 0, 255)), 'RGB')
144
+ quad += pad[:2]
145
+
146
+ # Transform.
147
+ img = img.transform((transform_size, transform_size), PIL.Image.QUAD, (quad + 0.5).flatten(), PIL.Image.BILINEAR)
148
+ if output_size < transform_size:
149
+ img = img.resize((output_size, output_size), PIL.Image.ANTIALIAS)
150
+
151
+ # Save aligned image.
152
+ return img
153
+
154
+
155
+ def chunks(lst, n):
156
+ """Yield successive n-sized chunks from lst."""
157
+ for i in range(0, len(lst), n):
158
+ yield lst[i:i + n]
159
+
160
+
161
+ def extract_on_paths(file_paths):
162
+ predictor = dlib.shape_predictor(SHAPE_PREDICTOR_PATH)
163
+ pid = mp.current_process().name
164
+ print('\t{} is starting to extract on #{} images'.format(pid, len(file_paths)))
165
+ tot_count = len(file_paths)
166
+ count = 0
167
+ for file_path, res_path in file_paths:
168
+ count += 1
169
+ if count % 100 == 0:
170
+ print('{} done with {}/{}'.format(pid, count, tot_count))
171
+ try:
172
+ res = align_face(file_path, predictor)
173
+ res = res.convert('RGB')
174
+ os.makedirs(os.path.dirname(res_path), exist_ok=True)
175
+ res.save(res_path)
176
+ except Exception:
177
+ continue
178
+ print('\tDone!')
179
+
180
+
181
+ def parse_args():
182
+ parser = ArgumentParser(add_help=False)
183
+ parser.add_argument('--num_threads', type=int, default=1)
184
+ parser.add_argument('--root_path', type=str, default='')
185
+ args = parser.parse_args()
186
+ return args
187
+
188
+
189
+ def run(args):
190
+ root_path = args.root_path
191
+ out_crops_path = root_path + '_crops'
192
+ if not os.path.exists(out_crops_path):
193
+ os.makedirs(out_crops_path, exist_ok=True)
194
+
195
+ file_paths = []
196
+ for root, dirs, files in os.walk(root_path):
197
+ for file in files:
198
+ file_path = os.path.join(root, file)
199
+ fname = os.path.join(out_crops_path, os.path.relpath(file_path, root_path))
200
+ res_path = '{}.jpg'.format(os.path.splitext(fname)[0])
201
+ if os.path.splitext(file_path)[1] == '.txt' or os.path.exists(res_path):
202
+ continue
203
+ file_paths.append((file_path, res_path))
204
+
205
+ file_chunks = list(chunks(file_paths, int(math.ceil(len(file_paths) / args.num_threads))))
206
+ print(len(file_chunks))
207
+ pool = mp.Pool(args.num_threads)
208
+ print('Running on {} paths\nHere we goooo'.format(len(file_paths)))
209
+ tic = time.time()
210
+ pool.map(extract_on_paths, file_chunks)
211
+ toc = time.time()
212
+ print('Mischief managed in {}s'.format(toc - tic))
213
+
214
+
215
+ if __name__ == '__main__':
216
+ args = parse_args()
217
+ run(args)
vtoonify/model/encoder/criteria/id_loss.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from torch import nn
3
+ from model.encoder.encoders.model_irse import Backbone
4
+
5
+
6
+ class IDLoss(nn.Module):
7
+ def __init__(self, model_paths):
8
+ super(IDLoss, self).__init__()
9
+ print('Loading ResNet ArcFace')
10
+ self.facenet = Backbone(input_size=112, num_layers=50, drop_ratio=0.6, mode='ir_se')
11
+ self.facenet.load_state_dict(torch.load(model_paths))
12
+ self.face_pool = torch.nn.AdaptiveAvgPool2d((112, 112))
13
+ self.facenet.eval()
14
+
15
+ def extract_feats(self, x):
16
+ x = x[:, :, 35:223, 32:220] # Crop interesting region
17
+ x = self.face_pool(x)
18
+ x_feats = self.facenet(x)
19
+ return x_feats
20
+
21
+ def forward(self, y_hat, y):
22
+ n_samples = y_hat.shape[0]
23
+ y_feats = self.extract_feats(y) # Otherwise use the feature from there
24
+ y_hat_feats = self.extract_feats(y_hat)
25
+ y_feats = y_feats.detach()
26
+ loss = 0
27
+ count = 0
28
+ for i in range(n_samples):
29
+ diff_target = y_hat_feats[i].dot(y_feats[i])
30
+ loss += 1 - diff_target
31
+ count += 1
32
+
33
+ return loss / count
vtoonify/model/encoder/encoders/__init__.py ADDED
File without changes
vtoonify/model/encoder/encoders/helpers.py ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from collections import namedtuple
2
+ import torch
3
+ from torch.nn import Conv2d, BatchNorm2d, PReLU, ReLU, Sigmoid, MaxPool2d, AdaptiveAvgPool2d, Sequential, Module
4
+
5
+ """
6
+ ArcFace implementation from [TreB1eN](https://github.com/TreB1eN/InsightFace_Pytorch)
7
+ """
8
+
9
+
10
+ class Flatten(Module):
11
+ def forward(self, input):
12
+ return input.view(input.size(0), -1)
13
+
14
+
15
+ def l2_norm(input, axis=1):
16
+ norm = torch.norm(input, 2, axis, True)
17
+ output = torch.div(input, norm)
18
+ return output
19
+
20
+
21
+ class Bottleneck(namedtuple('Block', ['in_channel', 'depth', 'stride'])):
22
+ """ A named tuple describing a ResNet block. """
23
+
24
+
25
+ def get_block(in_channel, depth, num_units, stride=2):
26
+ return [Bottleneck(in_channel, depth, stride)] + [Bottleneck(depth, depth, 1) for i in range(num_units - 1)]
27
+
28
+
29
+ def get_blocks(num_layers):
30
+ if num_layers == 50:
31
+ blocks = [
32
+ get_block(in_channel=64, depth=64, num_units=3),
33
+ get_block(in_channel=64, depth=128, num_units=4),
34
+ get_block(in_channel=128, depth=256, num_units=14),
35
+ get_block(in_channel=256, depth=512, num_units=3)
36
+ ]
37
+ elif num_layers == 100:
38
+ blocks = [
39
+ get_block(in_channel=64, depth=64, num_units=3),
40
+ get_block(in_channel=64, depth=128, num_units=13),
41
+ get_block(in_channel=128, depth=256, num_units=30),
42
+ get_block(in_channel=256, depth=512, num_units=3)
43
+ ]
44
+ elif num_layers == 152:
45
+ blocks = [
46
+ get_block(in_channel=64, depth=64, num_units=3),
47
+ get_block(in_channel=64, depth=128, num_units=8),
48
+ get_block(in_channel=128, depth=256, num_units=36),
49
+ get_block(in_channel=256, depth=512, num_units=3)
50
+ ]
51
+ else:
52
+ raise ValueError("Invalid number of layers: {}. Must be one of [50, 100, 152]".format(num_layers))
53
+ return blocks
54
+
55
+
56
+ class SEModule(Module):
57
+ def __init__(self, channels, reduction):
58
+ super(SEModule, self).__init__()
59
+ self.avg_pool = AdaptiveAvgPool2d(1)
60
+ self.fc1 = Conv2d(channels, channels // reduction, kernel_size=1, padding=0, bias=False)
61
+ self.relu = ReLU(inplace=True)
62
+ self.fc2 = Conv2d(channels // reduction, channels, kernel_size=1, padding=0, bias=False)
63
+ self.sigmoid = Sigmoid()
64
+
65
+ def forward(self, x):
66
+ module_input = x
67
+ x = self.avg_pool(x)
68
+ x = self.fc1(x)
69
+ x = self.relu(x)
70
+ x = self.fc2(x)
71
+ x = self.sigmoid(x)
72
+ return module_input * x
73
+
74
+
75
+ class bottleneck_IR(Module):
76
+ def __init__(self, in_channel, depth, stride):
77
+ super(bottleneck_IR, self).__init__()
78
+ if in_channel == depth:
79
+ self.shortcut_layer = MaxPool2d(1, stride)
80
+ else:
81
+ self.shortcut_layer = Sequential(
82
+ Conv2d(in_channel, depth, (1, 1), stride, bias=False),
83
+ BatchNorm2d(depth)
84
+ )
85
+ self.res_layer = Sequential(
86
+ BatchNorm2d(in_channel),
87
+ Conv2d(in_channel, depth, (3, 3), (1, 1), 1, bias=False), PReLU(depth),
88
+ Conv2d(depth, depth, (3, 3), stride, 1, bias=False), BatchNorm2d(depth)
89
+ )
90
+
91
+ def forward(self, x):
92
+ shortcut = self.shortcut_layer(x)
93
+ res = self.res_layer(x)
94
+ return res + shortcut
95
+
96
+
97
+ class bottleneck_IR_SE(Module):
98
+ def __init__(self, in_channel, depth, stride):
99
+ super(bottleneck_IR_SE, self).__init__()
100
+ if in_channel == depth:
101
+ self.shortcut_layer = MaxPool2d(1, stride)
102
+ else:
103
+ self.shortcut_layer = Sequential(
104
+ Conv2d(in_channel, depth, (1, 1), stride, bias=False),
105
+ BatchNorm2d(depth)
106
+ )
107
+ self.res_layer = Sequential(
108
+ BatchNorm2d(in_channel),
109
+ Conv2d(in_channel, depth, (3, 3), (1, 1), 1, bias=False),
110
+ PReLU(depth),
111
+ Conv2d(depth, depth, (3, 3), stride, 1, bias=False),
112
+ BatchNorm2d(depth),
113
+ SEModule(depth, 16)
114
+ )
115
+
116
+ def forward(self, x):
117
+ shortcut = self.shortcut_layer(x)
118
+ res = self.res_layer(x)
119
+ return res + shortcut
vtoonify/model/encoder/encoders/model_irse.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from torch.nn import Linear, Conv2d, BatchNorm1d, BatchNorm2d, PReLU, Dropout, Sequential, Module
2
+ from model.encoder.encoders.helpers import get_blocks, Flatten, bottleneck_IR, bottleneck_IR_SE, l2_norm
3
+
4
+ """
5
+ Modified Backbone implementation from [TreB1eN](https://github.com/TreB1eN/InsightFace_Pytorch)
6
+ """
7
+
8
+
9
+ class Backbone(Module):
10
+ def __init__(self, input_size, num_layers, mode='ir', drop_ratio=0.4, affine=True):
11
+ super(Backbone, self).__init__()
12
+ assert input_size in [112, 224], "input_size should be 112 or 224"
13
+ assert num_layers in [50, 100, 152], "num_layers should be 50, 100 or 152"
14
+ assert mode in ['ir', 'ir_se'], "mode should be ir or ir_se"
15
+ blocks = get_blocks(num_layers)
16
+ if mode == 'ir':
17
+ unit_module = bottleneck_IR
18
+ elif mode == 'ir_se':
19
+ unit_module = bottleneck_IR_SE
20
+ self.input_layer = Sequential(Conv2d(3, 64, (3, 3), 1, 1, bias=False),
21
+ BatchNorm2d(64),
22
+ PReLU(64))
23
+ if input_size == 112:
24
+ self.output_layer = Sequential(BatchNorm2d(512),
25
+ Dropout(drop_ratio),
26
+ Flatten(),
27
+ Linear(512 * 7 * 7, 512),
28
+ BatchNorm1d(512, affine=affine))
29
+ else:
30
+ self.output_layer = Sequential(BatchNorm2d(512),
31
+ Dropout(drop_ratio),
32
+ Flatten(),
33
+ Linear(512 * 14 * 14, 512),
34
+ BatchNorm1d(512, affine=affine))
35
+
36
+ modules = []
37
+ for block in blocks:
38
+ for bottleneck in block:
39
+ modules.append(unit_module(bottleneck.in_channel,
40
+ bottleneck.depth,
41
+ bottleneck.stride))
42
+ self.body = Sequential(*modules)
43
+
44
+ def forward(self, x):
45
+ x = self.input_layer(x)
46
+ x = self.body(x)
47
+ x = self.output_layer(x)
48
+ return l2_norm(x)
49
+
50
+
51
+ def IR_50(input_size):
52
+ """Constructs a ir-50 model."""
53
+ model = Backbone(input_size, num_layers=50, mode='ir', drop_ratio=0.4, affine=False)
54
+ return model
55
+
56
+
57
+ def IR_101(input_size):
58
+ """Constructs a ir-101 model."""
59
+ model = Backbone(input_size, num_layers=100, mode='ir', drop_ratio=0.4, affine=False)
60
+ return model
61
+
62
+
63
+ def IR_152(input_size):
64
+ """Constructs a ir-152 model."""
65
+ model = Backbone(input_size, num_layers=152, mode='ir', drop_ratio=0.4, affine=False)
66
+ return model
67
+
68
+
69
+ def IR_SE_50(input_size):
70
+ """Constructs a ir_se-50 model."""
71
+ model = Backbone(input_size, num_layers=50, mode='ir_se', drop_ratio=0.4, affine=False)
72
+ return model
73
+
74
+
75
+ def IR_SE_101(input_size):
76
+ """Constructs a ir_se-101 model."""
77
+ model = Backbone(input_size, num_layers=100, mode='ir_se', drop_ratio=0.4, affine=False)
78
+ return model
79
+
80
+
81
+ def IR_SE_152(input_size):
82
+ """Constructs a ir_se-152 model."""
83
+ model = Backbone(input_size, num_layers=152, mode='ir_se', drop_ratio=0.4, affine=False)
84
+ return model
vtoonify/model/encoder/encoders/psp_encoders.py ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import torch
3
+ import torch.nn.functional as F
4
+ from torch import nn
5
+ from torch.nn import Linear, Conv2d, BatchNorm2d, PReLU, Sequential, Module
6
+
7
+ from model.encoder.encoders.helpers import get_blocks, Flatten, bottleneck_IR, bottleneck_IR_SE
8
+ from model.stylegan.model import EqualLinear
9
+
10
+
11
+ class GradualStyleBlock(Module):
12
+ def __init__(self, in_c, out_c, spatial):
13
+ super(GradualStyleBlock, self).__init__()
14
+ self.out_c = out_c
15
+ self.spatial = spatial
16
+ num_pools = int(np.log2(spatial))
17
+ modules = []
18
+ modules += [Conv2d(in_c, out_c, kernel_size=3, stride=2, padding=1),
19
+ nn.LeakyReLU()]
20
+ for i in range(num_pools - 1):
21
+ modules += [
22
+ Conv2d(out_c, out_c, kernel_size=3, stride=2, padding=1),
23
+ nn.LeakyReLU()
24
+ ]
25
+ self.convs = nn.Sequential(*modules)
26
+ self.linear = EqualLinear(out_c, out_c, lr_mul=1)
27
+
28
+ def forward(self, x):
29
+ x = self.convs(x)
30
+ x = x.view(-1, self.out_c)
31
+ x = self.linear(x)
32
+ return x
33
+
34
+
35
+ class GradualStyleEncoder(Module):
36
+ def __init__(self, num_layers, mode='ir', opts=None):
37
+ super(GradualStyleEncoder, self).__init__()
38
+ assert num_layers in [50, 100, 152], 'num_layers should be 50,100, or 152'
39
+ assert mode in ['ir', 'ir_se'], 'mode should be ir or ir_se'
40
+ blocks = get_blocks(num_layers)
41
+ if mode == 'ir':
42
+ unit_module = bottleneck_IR
43
+ elif mode == 'ir_se':
44
+ unit_module = bottleneck_IR_SE
45
+ self.input_layer = Sequential(Conv2d(opts.input_nc, 64, (3, 3), 1, 1, bias=False),
46
+ BatchNorm2d(64),
47
+ PReLU(64))
48
+ modules = []
49
+ for block in blocks:
50
+ for bottleneck in block:
51
+ modules.append(unit_module(bottleneck.in_channel,
52
+ bottleneck.depth,
53
+ bottleneck.stride))
54
+ self.body = Sequential(*modules)
55
+
56
+ self.styles = nn.ModuleList()
57
+ self.style_count = opts.n_styles
58
+ self.coarse_ind = 3
59
+ self.middle_ind = 7
60
+ for i in range(self.style_count):
61
+ if i < self.coarse_ind:
62
+ style = GradualStyleBlock(512, 512, 16)
63
+ elif i < self.middle_ind:
64
+ style = GradualStyleBlock(512, 512, 32)
65
+ else:
66
+ style = GradualStyleBlock(512, 512, 64)
67
+ self.styles.append(style)
68
+ self.latlayer1 = nn.Conv2d(256, 512, kernel_size=1, stride=1, padding=0)
69
+ self.latlayer2 = nn.Conv2d(128, 512, kernel_size=1, stride=1, padding=0)
70
+
71
+ def _upsample_add(self, x, y):
72
+ '''Upsample and add two feature maps.
73
+ Args:
74
+ x: (Variable) top feature map to be upsampled.
75
+ y: (Variable) lateral feature map.
76
+ Returns:
77
+ (Variable) added feature map.
78
+ Note in PyTorch, when input size is odd, the upsampled feature map
79
+ with `F.upsample(..., scale_factor=2, mode='nearest')`
80
+ maybe not equal to the lateral feature map size.
81
+ e.g.
82
+ original input size: [N,_,15,15] ->
83
+ conv2d feature map size: [N,_,8,8] ->
84
+ upsampled feature map size: [N,_,16,16]
85
+ So we choose bilinear upsample which supports arbitrary output sizes.
86
+ '''
87
+ _, _, H, W = y.size()
88
+ return F.interpolate(x, size=(H, W), mode='bilinear', align_corners=True) + y
89
+
90
+ def forward(self, x):
91
+ x = self.input_layer(x)
92
+
93
+ latents = []
94
+ modulelist = list(self.body._modules.values())
95
+ for i, l in enumerate(modulelist):
96
+ x = l(x)
97
+ if i == 6:
98
+ c1 = x
99
+ elif i == 20:
100
+ c2 = x
101
+ elif i == 23:
102
+ c3 = x
103
+
104
+ for j in range(self.coarse_ind):
105
+ latents.append(self.styles[j](c3))
106
+
107
+ p2 = self._upsample_add(c3, self.latlayer1(c2))
108
+ for j in range(self.coarse_ind, self.middle_ind):
109
+ latents.append(self.styles[j](p2))
110
+
111
+ p1 = self._upsample_add(p2, self.latlayer2(c1))
112
+ for j in range(self.middle_ind, self.style_count):
113
+ latents.append(self.styles[j](p1))
114
+
115
+ out = torch.stack(latents, dim=1)
116
+ return out
117
+
118
+
119
+ class BackboneEncoderUsingLastLayerIntoW(Module):
120
+ def __init__(self, num_layers, mode='ir', opts=None):
121
+ super(BackboneEncoderUsingLastLayerIntoW, self).__init__()
122
+ print('Using BackboneEncoderUsingLastLayerIntoW')
123
+ assert num_layers in [50, 100, 152], 'num_layers should be 50,100, or 152'
124
+ assert mode in ['ir', 'ir_se'], 'mode should be ir or ir_se'
125
+ blocks = get_blocks(num_layers)
126
+ if mode == 'ir':
127
+ unit_module = bottleneck_IR
128
+ elif mode == 'ir_se':
129
+ unit_module = bottleneck_IR_SE
130
+ self.input_layer = Sequential(Conv2d(opts.input_nc, 64, (3, 3), 1, 1, bias=False),
131
+ BatchNorm2d(64),
132
+ PReLU(64))
133
+ self.output_pool = torch.nn.AdaptiveAvgPool2d((1, 1))
134
+ self.linear = EqualLinear(512, 512, lr_mul=1)
135
+ modules = []
136
+ for block in blocks:
137
+ for bottleneck in block:
138
+ modules.append(unit_module(bottleneck.in_channel,
139
+ bottleneck.depth,
140
+ bottleneck.stride))
141
+ self.body = Sequential(*modules)
142
+
143
+ def forward(self, x):
144
+ x = self.input_layer(x)
145
+ x = self.body(x)
146
+ x = self.output_pool(x)
147
+ x = x.view(-1, 512)
148
+ x = self.linear(x)
149
+ return x
150
+
151
+
152
+ class BackboneEncoderUsingLastLayerIntoWPlus(Module):
153
+ def __init__(self, num_layers, mode='ir', opts=None):
154
+ super(BackboneEncoderUsingLastLayerIntoWPlus, self).__init__()
155
+ print('Using BackboneEncoderUsingLastLayerIntoWPlus')
156
+ assert num_layers in [50, 100, 152], 'num_layers should be 50,100, or 152'
157
+ assert mode in ['ir', 'ir_se'], 'mode should be ir or ir_se'
158
+ blocks = get_blocks(num_layers)
159
+ if mode == 'ir':
160
+ unit_module = bottleneck_IR
161
+ elif mode == 'ir_se':
162
+ unit_module = bottleneck_IR_SE
163
+ self.n_styles = opts.n_styles
164
+ self.input_layer = Sequential(Conv2d(opts.input_nc, 64, (3, 3), 1, 1, bias=False),
165
+ BatchNorm2d(64),
166
+ PReLU(64))
167
+ self.output_layer_2 = Sequential(BatchNorm2d(512),
168
+ torch.nn.AdaptiveAvgPool2d((7, 7)),
169
+ Flatten(),
170
+ Linear(512 * 7 * 7, 512))
171
+ self.linear = EqualLinear(512, 512 * self.n_styles, lr_mul=1)
172
+ modules = []
173
+ for block in blocks:
174
+ for bottleneck in block:
175
+ modules.append(unit_module(bottleneck.in_channel,
176
+ bottleneck.depth,
177
+ bottleneck.stride))
178
+ self.body = Sequential(*modules)
179
+
180
+ def forward(self, x):
181
+ x = self.input_layer(x)
182
+ x = self.body(x)
183
+ x = self.output_layer_2(x)
184
+ x = self.linear(x)
185
+ x = x.view(-1, self.n_styles, 512)
186
+ return x
vtoonify/model/encoder/psp.py ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ This file defines the core research contribution
3
+ """
4
+ import matplotlib
5
+ matplotlib.use('Agg')
6
+ import math
7
+
8
+ import torch
9
+ from torch import nn
10
+ from model.encoder.encoders import psp_encoders
11
+ from model.stylegan.model import Generator
12
+
13
+ def get_keys(d, name):
14
+ if 'state_dict' in d:
15
+ d = d['state_dict']
16
+ d_filt = {k[len(name) + 1:]: v for k, v in d.items() if k[:len(name)] == name}
17
+ return d_filt
18
+
19
+
20
+ class pSp(nn.Module):
21
+
22
+ def __init__(self, opts):
23
+ super(pSp, self).__init__()
24
+ self.set_opts(opts)
25
+ # compute number of style inputs based on the output resolution
26
+ self.opts.n_styles = int(math.log(self.opts.output_size, 2)) * 2 - 2
27
+ # Define architecture
28
+ self.encoder = self.set_encoder()
29
+ self.decoder = Generator(self.opts.output_size, 512, 8)
30
+ self.face_pool = torch.nn.AdaptiveAvgPool2d((256, 256))
31
+ # Load weights if needed
32
+ self.load_weights()
33
+
34
+ def set_encoder(self):
35
+ if self.opts.encoder_type == 'GradualStyleEncoder':
36
+ encoder = psp_encoders.GradualStyleEncoder(50, 'ir_se', self.opts)
37
+ elif self.opts.encoder_type == 'BackboneEncoderUsingLastLayerIntoW':
38
+ encoder = psp_encoders.BackboneEncoderUsingLastLayerIntoW(50, 'ir_se', self.opts)
39
+ elif self.opts.encoder_type == 'BackboneEncoderUsingLastLayerIntoWPlus':
40
+ encoder = psp_encoders.BackboneEncoderUsingLastLayerIntoWPlus(50, 'ir_se', self.opts)
41
+ else:
42
+ raise Exception('{} is not a valid encoders'.format(self.opts.encoder_type))
43
+ return encoder
44
+
45
+ def load_weights(self):
46
+ if self.opts.checkpoint_path is not None:
47
+ print('Loading pSp from checkpoint: {}'.format(self.opts.checkpoint_path))
48
+ ckpt = torch.load(self.opts.checkpoint_path, map_location='cpu')
49
+ self.encoder.load_state_dict(get_keys(ckpt, 'encoder'), strict=True)
50
+ self.decoder.load_state_dict(get_keys(ckpt, 'decoder'), strict=True)
51
+ self.__load_latent_avg(ckpt)
52
+ else:
53
+ pass
54
+ '''print('Loading encoders weights from irse50!')
55
+ encoder_ckpt = torch.load(model_paths['ir_se50'])
56
+ # if input to encoder is not an RGB image, do not load the input layer weights
57
+ if self.opts.label_nc != 0:
58
+ encoder_ckpt = {k: v for k, v in encoder_ckpt.items() if "input_layer" not in k}
59
+ self.encoder.load_state_dict(encoder_ckpt, strict=False)
60
+ print('Loading decoder weights from pretrained!')
61
+ ckpt = torch.load(self.opts.stylegan_weights)
62
+ self.decoder.load_state_dict(ckpt['g_ema'], strict=False)
63
+ if self.opts.learn_in_w:
64
+ self.__load_latent_avg(ckpt, repeat=1)
65
+ else:
66
+ self.__load_latent_avg(ckpt, repeat=self.opts.n_styles)
67
+ '''
68
+
69
+ def forward(self, x, resize=True, latent_mask=None, input_code=False, randomize_noise=True,
70
+ inject_latent=None, return_latents=False, alpha=None, z_plus_latent=False, return_z_plus_latent=True):
71
+ if input_code:
72
+ codes = x
73
+ else:
74
+ codes = self.encoder(x)
75
+ #print(codes.shape)
76
+ # normalize with respect to the center of an average face
77
+ if self.opts.start_from_latent_avg:
78
+ if self.opts.learn_in_w:
79
+ codes = codes + self.latent_avg.repeat(codes.shape[0], 1)
80
+ else:
81
+ codes = codes + self.latent_avg.repeat(codes.shape[0], 1, 1)
82
+
83
+
84
+ if latent_mask is not None:
85
+ for i in latent_mask:
86
+ if inject_latent is not None:
87
+ if alpha is not None:
88
+ codes[:, i] = alpha * inject_latent[:, i] + (1 - alpha) * codes[:, i]
89
+ else:
90
+ codes[:, i] = inject_latent[:, i]
91
+ else:
92
+ codes[:, i] = 0
93
+
94
+ input_is_latent = not input_code
95
+ if z_plus_latent:
96
+ input_is_latent = False
97
+ images, result_latent = self.decoder([codes],
98
+ input_is_latent=input_is_latent,
99
+ randomize_noise=randomize_noise,
100
+ return_latents=return_latents,
101
+ z_plus_latent=z_plus_latent)
102
+
103
+ if resize:
104
+ images = self.face_pool(images)
105
+
106
+ if return_latents:
107
+ if z_plus_latent and return_z_plus_latent:
108
+ return images, codes
109
+ if z_plus_latent and not return_z_plus_latent:
110
+ return images, result_latent
111
+ else:
112
+ return images, result_latent
113
+ else:
114
+ return images
115
+
116
+ def set_opts(self, opts):
117
+ self.opts = opts
118
+
119
+ def __load_latent_avg(self, ckpt, repeat=None):
120
+ if 'latent_avg' in ckpt:
121
+ self.latent_avg = ckpt['latent_avg'].to(self.opts.device)
122
+ if repeat is not None:
123
+ self.latent_avg = self.latent_avg.repeat(repeat, 1)
124
+ else:
125
+ self.latent_avg = None
vtoonify/model/encoder/readme.md ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ # Encoding in Style: a StyleGAN Encoder for Image-to-Image Translation
2
+
3
+ ## Description
4
+ Official Implementation of pSp paper for both training and evaluation. The pSp method extends the StyleGAN model to
5
+ allow solving different image-to-image translation problems using its encoder.
6
+
7
+ Fork from [https://github.com/eladrich/pixel2style2pixel](https://github.com/eladrich/pixel2style2pixel).
8
+
9
+ In VToonify, we modify pSp to accept z+ latent code.
vtoonify/model/raft/LICENSE ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2020, princeton-vl
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ * Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
vtoonify/model/raft/RAFT.png ADDED
vtoonify/model/raft/README.md ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RAFT
2
+ This repository contains the source code for our paper:
3
+
4
+ [RAFT: Recurrent All Pairs Field Transforms for Optical Flow](https://arxiv.org/pdf/2003.12039.pdf)<br/>
5
+ ECCV 2020 <br/>
6
+ Zachary Teed and Jia Deng<br/>
7
+
8
+ <img src="RAFT.png">
9
+
10
+ ## Requirements
11
+ The code has been tested with PyTorch 1.6 and Cuda 10.1.
12
+ ```Shell
13
+ conda create --name raft
14
+ conda activate raft
15
+ conda install pytorch=1.6.0 torchvision=0.7.0 cudatoolkit=10.1 matplotlib tensorboard scipy opencv -c pytorch
16
+ ```
17
+
18
+ ## Demos
19
+ Pretrained models can be downloaded by running
20
+ ```Shell
21
+ ./download_models.sh
22
+ ```
23
+ or downloaded from [google drive](https://drive.google.com/drive/folders/1sWDsfuZ3Up38EUQt7-JDTT1HcGHuJgvT?usp=sharing)
24
+
25
+ You can demo a trained model on a sequence of frames
26
+ ```Shell
27
+ python demo.py --model=models/raft-things.pth --path=demo-frames
28
+ ```
29
+
30
+ ## Required Data
31
+ To evaluate/train RAFT, you will need to download the required datasets.
32
+ * [FlyingChairs](https://lmb.informatik.uni-freiburg.de/resources/datasets/FlyingChairs.en.html#flyingchairs)
33
+ * [FlyingThings3D](https://lmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.html)
34
+ * [Sintel](http://sintel.is.tue.mpg.de/)
35
+ * [KITTI](http://www.cvlibs.net/datasets/kitti/eval_scene_flow.php?benchmark=flow)
36
+ * [HD1K](http://hci-benchmark.iwr.uni-heidelberg.de/) (optional)
37
+
38
+
39
+ By default `datasets.py` will search for the datasets in these locations. You can create symbolic links to wherever the datasets were downloaded in the `datasets` folder
40
+
41
+ ```Shell
42
+ ├── datasets
43
+ ├── Sintel
44
+ ├── test
45
+ ├── training
46
+ ├── KITTI
47
+ ├── testing
48
+ ├── training
49
+ ├── devkit
50
+ ├── FlyingChairs_release
51
+ ├── data
52
+ ├── FlyingThings3D
53
+ ├── frames_cleanpass
54
+ ├── frames_finalpass
55
+ ├── optical_flow
56
+ ```
57
+
58
+ ## Evaluation
59
+ You can evaluate a trained model using `evaluate.py`
60
+ ```Shell
61
+ python evaluate.py --model=models/raft-things.pth --dataset=sintel --mixed_precision
62
+ ```
63
+
64
+ ## Training
65
+ We used the following training schedule in our paper (2 GPUs). Training logs will be written to the `runs` which can be visualized using tensorboard
66
+ ```Shell
67
+ ./train_standard.sh
68
+ ```
69
+
70
+ If you have a RTX GPU, training can be accelerated using mixed precision. You can expect similiar results in this setting (1 GPU)
71
+ ```Shell
72
+ ./train_mixed.sh
73
+ ```
74
+
75
+ ## (Optional) Efficent Implementation
76
+ You can optionally use our alternate (efficent) implementation by compiling the provided cuda extension
77
+ ```Shell
78
+ cd alt_cuda_corr && python setup.py install && cd ..
79
+ ```
80
+ and running `demo.py` and `evaluate.py` with the `--alternate_corr` flag Note, this implementation is somewhat slower than all-pairs, but uses significantly less GPU memory during the forward pass.
vtoonify/model/raft/alt_cuda_corr/correlation.cpp ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #include <torch/extension.h>
2
+ #include <vector>
3
+
4
+ // CUDA forward declarations
5
+ std::vector<torch::Tensor> corr_cuda_forward(
6
+ torch::Tensor fmap1,
7
+ torch::Tensor fmap2,
8
+ torch::Tensor coords,
9
+ int radius);
10
+
11
+ std::vector<torch::Tensor> corr_cuda_backward(
12
+ torch::Tensor fmap1,
13
+ torch::Tensor fmap2,
14
+ torch::Tensor coords,
15
+ torch::Tensor corr_grad,
16
+ int radius);
17
+
18
+ // C++ interface
19
+ #define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x " must be a CUDA tensor")
20
+ #define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x " must be contiguous")
21
+ #define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x)
22
+
23
+ std::vector<torch::Tensor> corr_forward(
24
+ torch::Tensor fmap1,
25
+ torch::Tensor fmap2,
26
+ torch::Tensor coords,
27
+ int radius) {
28
+ CHECK_INPUT(fmap1);
29
+ CHECK_INPUT(fmap2);
30
+ CHECK_INPUT(coords);
31
+
32
+ return corr_cuda_forward(fmap1, fmap2, coords, radius);
33
+ }
34
+
35
+
36
+ std::vector<torch::Tensor> corr_backward(
37
+ torch::Tensor fmap1,
38
+ torch::Tensor fmap2,
39
+ torch::Tensor coords,
40
+ torch::Tensor corr_grad,
41
+ int radius) {
42
+ CHECK_INPUT(fmap1);
43
+ CHECK_INPUT(fmap2);
44
+ CHECK_INPUT(coords);
45
+ CHECK_INPUT(corr_grad);
46
+
47
+ return corr_cuda_backward(fmap1, fmap2, coords, corr_grad, radius);
48
+ }
49
+
50
+
51
+ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
52
+ m.def("forward", &corr_forward, "CORR forward");
53
+ m.def("backward", &corr_backward, "CORR backward");
54
+ }
vtoonify/model/raft/alt_cuda_corr/correlation_kernel.cu ADDED
@@ -0,0 +1,324 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #include <torch/extension.h>
2
+ #include <cuda.h>
3
+ #include <cuda_runtime.h>
4
+ #include <vector>
5
+
6
+
7
+ #define BLOCK_H 4
8
+ #define BLOCK_W 8
9
+ #define BLOCK_HW BLOCK_H * BLOCK_W
10
+ #define CHANNEL_STRIDE 32
11
+
12
+
13
+ __forceinline__ __device__
14
+ bool within_bounds(int h, int w, int H, int W) {
15
+ return h >= 0 && h < H && w >= 0 && w < W;
16
+ }
17
+
18
+ template <typename scalar_t>
19
+ __global__ void corr_forward_kernel(
20
+ const torch::PackedTensorAccessor32<scalar_t,4,torch::RestrictPtrTraits> fmap1,
21
+ const torch::PackedTensorAccessor32<scalar_t,4,torch::RestrictPtrTraits> fmap2,
22
+ const torch::PackedTensorAccessor32<scalar_t,5,torch::RestrictPtrTraits> coords,
23
+ torch::PackedTensorAccessor32<scalar_t,5,torch::RestrictPtrTraits> corr,
24
+ int r)
25
+ {
26
+ const int b = blockIdx.x;
27
+ const int h0 = blockIdx.y * blockDim.x;
28
+ const int w0 = blockIdx.z * blockDim.y;
29
+ const int tid = threadIdx.x * blockDim.y + threadIdx.y;
30
+
31
+ const int H1 = fmap1.size(1);
32
+ const int W1 = fmap1.size(2);
33
+ const int H2 = fmap2.size(1);
34
+ const int W2 = fmap2.size(2);
35
+ const int N = coords.size(1);
36
+ const int C = fmap1.size(3);
37
+
38
+ __shared__ scalar_t f1[CHANNEL_STRIDE][BLOCK_HW+1];
39
+ __shared__ scalar_t f2[CHANNEL_STRIDE][BLOCK_HW+1];
40
+ __shared__ scalar_t x2s[BLOCK_HW];
41
+ __shared__ scalar_t y2s[BLOCK_HW];
42
+
43
+ for (int c=0; c<C; c+=CHANNEL_STRIDE) {
44
+ for (int k=0; k<BLOCK_HW; k+=BLOCK_HW/CHANNEL_STRIDE) {
45
+ int k1 = k + tid / CHANNEL_STRIDE;
46
+ int h1 = h0 + k1 / BLOCK_W;
47
+ int w1 = w0 + k1 % BLOCK_W;
48
+ int c1 = tid % CHANNEL_STRIDE;
49
+
50
+ auto fptr = fmap1[b][h1][w1];
51
+ if (within_bounds(h1, w1, H1, W1))
52
+ f1[c1][k1] = fptr[c+c1];
53
+ else
54
+ f1[c1][k1] = 0.0;
55
+ }
56
+
57
+ __syncthreads();
58
+
59
+ for (int n=0; n<N; n++) {
60
+ int h1 = h0 + threadIdx.x;
61
+ int w1 = w0 + threadIdx.y;
62
+ if (within_bounds(h1, w1, H1, W1)) {
63
+ x2s[tid] = coords[b][n][h1][w1][0];
64
+ y2s[tid] = coords[b][n][h1][w1][1];
65
+ }
66
+
67
+ scalar_t dx = x2s[tid] - floor(x2s[tid]);
68
+ scalar_t dy = y2s[tid] - floor(y2s[tid]);
69
+
70
+ int rd = 2*r + 1;
71
+ for (int iy=0; iy<rd+1; iy++) {
72
+ for (int ix=0; ix<rd+1; ix++) {
73
+ for (int k=0; k<BLOCK_HW; k+=BLOCK_HW/CHANNEL_STRIDE) {
74
+ int k1 = k + tid / CHANNEL_STRIDE;
75
+ int h2 = static_cast<int>(floor(y2s[k1]))-r+iy;
76
+ int w2 = static_cast<int>(floor(x2s[k1]))-r+ix;
77
+ int c2 = tid % CHANNEL_STRIDE;
78
+
79
+ auto fptr = fmap2[b][h2][w2];
80
+ if (within_bounds(h2, w2, H2, W2))
81
+ f2[c2][k1] = fptr[c+c2];
82
+ else
83
+ f2[c2][k1] = 0.0;
84
+ }
85
+
86
+ __syncthreads();
87
+
88
+ scalar_t s = 0.0;
89
+ for (int k=0; k<CHANNEL_STRIDE; k++)
90
+ s += f1[k][tid] * f2[k][tid];
91
+
92
+ int ix_nw = H1*W1*((iy-1) + rd*(ix-1));
93
+ int ix_ne = H1*W1*((iy-1) + rd*ix);
94
+ int ix_sw = H1*W1*(iy + rd*(ix-1));
95
+ int ix_se = H1*W1*(iy + rd*ix);
96
+
97
+ scalar_t nw = s * (dy) * (dx);
98
+ scalar_t ne = s * (dy) * (1-dx);
99
+ scalar_t sw = s * (1-dy) * (dx);
100
+ scalar_t se = s * (1-dy) * (1-dx);
101
+
102
+ scalar_t* corr_ptr = &corr[b][n][0][h1][w1];
103
+
104
+ if (iy > 0 && ix > 0 && within_bounds(h1, w1, H1, W1))
105
+ *(corr_ptr + ix_nw) += nw;
106
+
107
+ if (iy > 0 && ix < rd && within_bounds(h1, w1, H1, W1))
108
+ *(corr_ptr + ix_ne) += ne;
109
+
110
+ if (iy < rd && ix > 0 && within_bounds(h1, w1, H1, W1))
111
+ *(corr_ptr + ix_sw) += sw;
112
+
113
+ if (iy < rd && ix < rd && within_bounds(h1, w1, H1, W1))
114
+ *(corr_ptr + ix_se) += se;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+
121
+
122
+ template <typename scalar_t>
123
+ __global__ void corr_backward_kernel(
124
+ const torch::PackedTensorAccessor32<scalar_t,4,torch::RestrictPtrTraits> fmap1,
125
+ const torch::PackedTensorAccessor32<scalar_t,4,torch::RestrictPtrTraits> fmap2,
126
+ const torch::PackedTensorAccessor32<scalar_t,5,torch::RestrictPtrTraits> coords,
127
+ const torch::PackedTensorAccessor32<scalar_t,5,torch::RestrictPtrTraits> corr_grad,
128
+ torch::PackedTensorAccessor32<scalar_t,4,torch::RestrictPtrTraits> fmap1_grad,
129
+ torch::PackedTensorAccessor32<scalar_t,4,torch::RestrictPtrTraits> fmap2_grad,
130
+ torch::PackedTensorAccessor32<scalar_t,5,torch::RestrictPtrTraits> coords_grad,
131
+ int r)
132
+ {
133
+
134
+ const int b = blockIdx.x;
135
+ const int h0 = blockIdx.y * blockDim.x;
136
+ const int w0 = blockIdx.z * blockDim.y;
137
+ const int tid = threadIdx.x * blockDim.y + threadIdx.y;
138
+
139
+ const int H1 = fmap1.size(1);
140
+ const int W1 = fmap1.size(2);
141
+ const int H2 = fmap2.size(1);
142
+ const int W2 = fmap2.size(2);
143
+ const int N = coords.size(1);
144
+ const int C = fmap1.size(3);
145
+
146
+ __shared__ scalar_t f1[CHANNEL_STRIDE][BLOCK_HW+1];
147
+ __shared__ scalar_t f2[CHANNEL_STRIDE][BLOCK_HW+1];
148
+
149
+ __shared__ scalar_t f1_grad[CHANNEL_STRIDE][BLOCK_HW+1];
150
+ __shared__ scalar_t f2_grad[CHANNEL_STRIDE][BLOCK_HW+1];
151
+
152
+ __shared__ scalar_t x2s[BLOCK_HW];
153
+ __shared__ scalar_t y2s[BLOCK_HW];
154
+
155
+ for (int c=0; c<C; c+=CHANNEL_STRIDE) {
156
+
157
+ for (int k=0; k<BLOCK_HW; k+=BLOCK_HW/CHANNEL_STRIDE) {
158
+ int k1 = k + tid / CHANNEL_STRIDE;
159
+ int h1 = h0 + k1 / BLOCK_W;
160
+ int w1 = w0 + k1 % BLOCK_W;
161
+ int c1 = tid % CHANNEL_STRIDE;
162
+
163
+ auto fptr = fmap1[b][h1][w1];
164
+ if (within_bounds(h1, w1, H1, W1))
165
+ f1[c1][k1] = fptr[c+c1];
166
+ else
167
+ f1[c1][k1] = 0.0;
168
+
169
+ f1_grad[c1][k1] = 0.0;
170
+ }
171
+
172
+ __syncthreads();
173
+
174
+ int h1 = h0 + threadIdx.x;
175
+ int w1 = w0 + threadIdx.y;
176
+
177
+ for (int n=0; n<N; n++) {
178
+ x2s[tid] = coords[b][n][h1][w1][0];
179
+ y2s[tid] = coords[b][n][h1][w1][1];
180
+
181
+ scalar_t dx = x2s[tid] - floor(x2s[tid]);
182
+ scalar_t dy = y2s[tid] - floor(y2s[tid]);
183
+
184
+ int rd = 2*r + 1;
185
+ for (int iy=0; iy<rd+1; iy++) {
186
+ for (int ix=0; ix<rd+1; ix++) {
187
+ for (int k=0; k<BLOCK_HW; k+=BLOCK_HW/CHANNEL_STRIDE) {
188
+ int k1 = k + tid / CHANNEL_STRIDE;
189
+ int h2 = static_cast<int>(floor(y2s[k1]))-r+iy;
190
+ int w2 = static_cast<int>(floor(x2s[k1]))-r+ix;
191
+ int c2 = tid % CHANNEL_STRIDE;
192
+
193
+ auto fptr = fmap2[b][h2][w2];
194
+ if (within_bounds(h2, w2, H2, W2))
195
+ f2[c2][k1] = fptr[c+c2];
196
+ else
197
+ f2[c2][k1] = 0.0;
198
+
199
+ f2_grad[c2][k1] = 0.0;
200
+ }
201
+
202
+ __syncthreads();
203
+
204
+ const scalar_t* grad_ptr = &corr_grad[b][n][0][h1][w1];
205
+ scalar_t g = 0.0;
206
+
207
+ int ix_nw = H1*W1*((iy-1) + rd*(ix-1));
208
+ int ix_ne = H1*W1*((iy-1) + rd*ix);
209
+ int ix_sw = H1*W1*(iy + rd*(ix-1));
210
+ int ix_se = H1*W1*(iy + rd*ix);
211
+
212
+ if (iy > 0 && ix > 0 && within_bounds(h1, w1, H1, W1))
213
+ g += *(grad_ptr + ix_nw) * dy * dx;
214
+
215
+ if (iy > 0 && ix < rd && within_bounds(h1, w1, H1, W1))
216
+ g += *(grad_ptr + ix_ne) * dy * (1-dx);
217
+
218
+ if (iy < rd && ix > 0 && within_bounds(h1, w1, H1, W1))
219
+ g += *(grad_ptr + ix_sw) * (1-dy) * dx;
220
+
221
+ if (iy < rd && ix < rd && within_bounds(h1, w1, H1, W1))
222
+ g += *(grad_ptr + ix_se) * (1-dy) * (1-dx);
223
+
224
+ for (int k=0; k<CHANNEL_STRIDE; k++) {
225
+ f1_grad[k][tid] += g * f2[k][tid];
226
+ f2_grad[k][tid] += g * f1[k][tid];
227
+ }
228
+
229
+ for (int k=0; k<BLOCK_HW; k+=BLOCK_HW/CHANNEL_STRIDE) {
230
+ int k1 = k + tid / CHANNEL_STRIDE;
231
+ int h2 = static_cast<int>(floor(y2s[k1]))-r+iy;
232
+ int w2 = static_cast<int>(floor(x2s[k1]))-r+ix;
233
+ int c2 = tid % CHANNEL_STRIDE;
234
+
235
+ scalar_t* fptr = &fmap2_grad[b][h2][w2][0];
236
+ if (within_bounds(h2, w2, H2, W2))
237
+ atomicAdd(fptr+c+c2, f2_grad[c2][k1]);
238
+ }
239
+ }
240
+ }
241
+ }
242
+ __syncthreads();
243
+
244
+
245
+ for (int k=0; k<BLOCK_HW; k+=BLOCK_HW/CHANNEL_STRIDE) {
246
+ int k1 = k + tid / CHANNEL_STRIDE;
247
+ int h1 = h0 + k1 / BLOCK_W;
248
+ int w1 = w0 + k1 % BLOCK_W;
249
+ int c1 = tid % CHANNEL_STRIDE;
250
+
251
+ scalar_t* fptr = &fmap1_grad[b][h1][w1][0];
252
+ if (within_bounds(h1, w1, H1, W1))
253
+ fptr[c+c1] += f1_grad[c1][k1];
254
+ }
255
+ }
256
+ }
257
+
258
+
259
+
260
+ std::vector<torch::Tensor> corr_cuda_forward(
261
+ torch::Tensor fmap1,
262
+ torch::Tensor fmap2,
263
+ torch::Tensor coords,
264
+ int radius)
265
+ {
266
+ const auto B = coords.size(0);
267
+ const auto N = coords.size(1);
268
+ const auto H = coords.size(2);
269
+ const auto W = coords.size(3);
270
+
271
+ const auto rd = 2 * radius + 1;
272
+ auto opts = fmap1.options();
273
+ auto corr = torch::zeros({B, N, rd*rd, H, W}, opts);
274
+
275
+ const dim3 blocks(B, (H+BLOCK_H-1)/BLOCK_H, (W+BLOCK_W-1)/BLOCK_W);
276
+ const dim3 threads(BLOCK_H, BLOCK_W);
277
+
278
+ corr_forward_kernel<float><<<blocks, threads>>>(
279
+ fmap1.packed_accessor32<float,4,torch::RestrictPtrTraits>(),
280
+ fmap2.packed_accessor32<float,4,torch::RestrictPtrTraits>(),
281
+ coords.packed_accessor32<float,5,torch::RestrictPtrTraits>(),
282
+ corr.packed_accessor32<float,5,torch::RestrictPtrTraits>(),
283
+ radius);
284
+
285
+ return {corr};
286
+ }
287
+
288
+ std::vector<torch::Tensor> corr_cuda_backward(
289
+ torch::Tensor fmap1,
290
+ torch::Tensor fmap2,
291
+ torch::Tensor coords,
292
+ torch::Tensor corr_grad,
293
+ int radius)
294
+ {
295
+ const auto B = coords.size(0);
296
+ const auto N = coords.size(1);
297
+
298
+ const auto H1 = fmap1.size(1);
299
+ const auto W1 = fmap1.size(2);
300
+ const auto H2 = fmap2.size(1);
301
+ const auto W2 = fmap2.size(2);
302
+ const auto C = fmap1.size(3);
303
+
304
+ auto opts = fmap1.options();
305
+ auto fmap1_grad = torch::zeros({B, H1, W1, C}, opts);
306
+ auto fmap2_grad = torch::zeros({B, H2, W2, C}, opts);
307
+ auto coords_grad = torch::zeros({B, N, H1, W1, 2}, opts);
308
+
309
+ const dim3 blocks(B, (H1+BLOCK_H-1)/BLOCK_H, (W1+BLOCK_W-1)/BLOCK_W);
310
+ const dim3 threads(BLOCK_H, BLOCK_W);
311
+
312
+
313
+ corr_backward_kernel<float><<<blocks, threads>>>(
314
+ fmap1.packed_accessor32<float,4,torch::RestrictPtrTraits>(),
315
+ fmap2.packed_accessor32<float,4,torch::RestrictPtrTraits>(),
316
+ coords.packed_accessor32<float,5,torch::RestrictPtrTraits>(),
317
+ corr_grad.packed_accessor32<float,5,torch::RestrictPtrTraits>(),
318
+ fmap1_grad.packed_accessor32<float,4,torch::RestrictPtrTraits>(),
319
+ fmap2_grad.packed_accessor32<float,4,torch::RestrictPtrTraits>(),
320
+ coords_grad.packed_accessor32<float,5,torch::RestrictPtrTraits>(),
321
+ radius);
322
+
323
+ return {fmap1_grad, fmap2_grad, coords_grad};
324
+ }
vtoonify/model/raft/alt_cuda_corr/setup.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from setuptools import setup
2
+ from torch.utils.cpp_extension import BuildExtension, CUDAExtension
3
+
4
+
5
+ setup(
6
+ name='correlation',
7
+ ext_modules=[
8
+ CUDAExtension('alt_cuda_corr',
9
+ sources=['correlation.cpp', 'correlation_kernel.cu'],
10
+ extra_compile_args={'cxx': [], 'nvcc': ['-O3']}),
11
+ ],
12
+ cmdclass={
13
+ 'build_ext': BuildExtension
14
+ })
15
+
vtoonify/model/raft/chairs_split.txt ADDED
@@ -0,0 +1,22872 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1
2
+ 1
3
+ 1
4
+ 1
5
+ 1
6
+ 2
7
+ 1
8
+ 1
9
+ 1
10
+ 1
11
+ 1
12
+ 1
13
+ 1
14
+ 1
15
+ 1
16
+ 1
17
+ 1
18
+ 2
19
+ 1
20
+ 1
21
+ 1
22
+ 1
23
+ 1
24
+ 1
25
+ 1
26
+ 1
27
+ 1
28
+ 1
29
+ 1
30
+ 1
31
+ 1
32
+ 1
33
+ 1
34
+ 1
35
+ 1
36
+ 1
37
+ 1
38
+ 1
39
+ 1
40
+ 1
41
+ 1
42
+ 1
43
+ 2
44
+ 1
45
+ 1
46
+ 2
47
+ 1
48
+ 1
49
+ 1
50
+ 1
51
+ 1
52
+ 1
53
+ 1
54
+ 1
55
+ 1
56
+ 1
57
+ 1
58
+ 1
59
+ 2
60
+ 1
61
+ 1
62
+ 1
63
+ 2
64
+ 1
65
+ 1
66
+ 1
67
+ 1
68
+ 1
69
+ 1
70
+ 1
71
+ 1
72
+ 1
73
+ 1
74
+ 1
75
+ 1
76
+ 1
77
+ 1
78
+ 1
79
+ 1
80
+ 1
81
+ 1
82
+ 1
83
+ 1
84
+ 1
85
+ 1
86
+ 1
87
+ 1
88
+ 1
89
+ 1
90
+ 1
91
+ 1
92
+ 1
93
+ 1
94
+ 1
95
+ 1
96
+ 1
97
+ 2
98
+ 1
99
+ 1
100
+ 1
101
+ 1
102
+ 1
103
+ 1
104
+ 1
105
+ 1
106
+ 1
107
+ 1
108
+ 1
109
+ 1
110
+ 1
111
+ 1
112
+ 2
113
+ 1
114
+ 1
115
+ 1
116
+ 1
117
+ 1
118
+ 2
119
+ 1
120
+ 1
121
+ 2
122
+ 2
123
+ 1
124
+ 1
125
+ 1
126
+ 1
127
+ 1
128
+ 1
129
+ 1
130
+ 1
131
+ 1
132
+ 2
133
+ 2
134
+ 1
135
+ 1
136
+ 1
137
+ 1
138
+ 1
139
+ 1
140
+ 1
141
+ 1
142
+ 1
143
+ 1
144
+ 1
145
+ 1
146
+ 1
147
+ 1
148
+ 1
149
+ 1
150
+ 1
151
+ 1
152
+ 1
153
+ 2
154
+ 1
155
+ 1
156
+ 1
157
+ 1
158
+ 1
159
+ 1
160
+ 1
161
+ 2
162
+ 1
163
+ 1
164
+ 1
165
+ 1
166
+ 1
167
+ 1
168
+ 1
169
+ 1
170
+ 1
171
+ 1
172
+ 1
173
+ 1
174
+ 1
175
+ 1
176
+ 1
177
+ 1
178
+ 1
179
+ 1
180
+ 1
181
+ 1
182
+ 1
183
+ 1
184
+ 1
185
+ 1
186
+ 1
187
+ 1
188
+ 1
189
+ 1
190
+ 1
191
+ 1
192
+ 1
193
+ 1
194
+ 1
195
+ 1
196
+ 1
197
+ 1
198
+ 1
199
+ 1
200
+ 1
201
+ 1
202
+ 1
203
+ 1
204
+ 1
205
+ 1
206
+ 1
207
+ 1
208
+ 1
209
+ 1
210
+ 1
211
+ 1
212
+ 1
213
+ 1
214
+ 1
215
+ 1
216
+ 1
217
+ 1
218
+ 1
219
+ 1
220
+ 1
221
+ 1
222
+ 1
223
+ 1
224
+ 1
225
+ 1
226
+ 1
227
+ 1
228
+ 1
229
+ 1
230
+ 1
231
+ 1
232
+ 1
233
+ 1
234
+ 1
235
+ 1
236
+ 1
237
+ 1
238
+ 1
239
+ 1
240
+ 1
241
+ 1
242
+ 1
243
+ 1
244
+ 1
245
+ 1
246
+ 1
247
+ 1
248
+ 1
249
+ 2
250
+ 1
251
+ 1
252
+ 1
253
+ 1
254
+ 1
255
+ 1
256
+ 1
257
+ 1
258
+ 1
259
+ 1
260
+ 1
261
+ 1
262
+ 1
263
+ 1
264
+ 2
265
+ 2
266
+ 1
267
+ 1
268
+ 1
269
+ 1
270
+ 1
271
+ 1
272
+ 1
273
+ 1
274
+ 1
275
+ 1
276
+ 1
277
+ 1
278
+ 1
279
+ 1
280
+ 1
281
+ 1
282
+ 1
283
+ 1
284
+ 1
285
+ 1
286
+ 1
287
+ 1
288
+ 1
289
+ 1
290
+ 1
291
+ 1
292
+ 2
293
+ 1
294
+ 2
295
+ 1
296
+ 2
297
+ 1
298
+ 1
299
+ 1
300
+ 2
301
+ 1
302
+ 1
303
+ 1
304
+ 1
305
+ 1
306
+ 1
307
+ 1
308
+ 1
309
+ 1
310
+ 1
311
+ 1
312
+ 1
313
+ 1
314
+ 1
315
+ 1
316
+ 1
317
+ 2
318
+ 1
319
+ 1
320
+ 1
321
+ 2
322
+ 1
323
+ 1
324
+ 1
325
+ 1
326
+ 1
327
+ 1
328
+ 1
329
+ 1
330
+ 1
331
+ 1
332
+ 1
333
+ 1
334
+ 1
335
+ 1
336
+ 1
337
+ 2
338
+ 2
339
+ 1
340
+ 1
341
+ 1
342
+ 1
343
+ 1
344
+ 2
345
+ 1
346
+ 1
347
+ 1
348
+ 1
349
+ 1
350
+ 1
351
+ 1
352
+ 1
353
+ 1
354
+ 1
355
+ 1
356
+ 1
357
+ 1
358
+ 1
359
+ 2
360
+ 1
361
+ 1
362
+ 1
363
+ 1
364
+ 1
365
+ 1
366
+ 1
367
+ 1
368
+ 1
369
+ 1
370
+ 1
371
+ 1
372
+ 1
373
+ 1
374
+ 1
375
+ 1
376
+ 1
377
+ 1
378
+ 1
379
+ 1
380
+ 1
381
+ 1
382
+ 1
383
+ 1
384
+ 1
385
+ 1
386
+ 1
387
+ 1
388
+ 1
389
+ 1
390
+ 1
391
+ 1
392
+ 1
393
+ 1
394
+ 1
395
+ 1
396
+ 1
397
+ 1
398
+ 1
399
+ 1
400
+ 2
401
+ 1
402
+ 2
403
+ 1
404
+ 1
405
+ 1
406
+ 1
407
+ 1
408
+ 1
409
+ 1
410
+ 1
411
+ 1
412
+ 1
413
+ 1
414
+ 1
415
+ 1
416
+ 1
417
+ 1
418
+ 1
419
+ 1
420
+ 1
421
+ 1
422
+ 1
423
+ 1
424
+ 1
425
+ 1
426
+ 1
427
+ 1
428
+ 1
429
+ 1
430
+ 2
431
+ 1
432
+ 1
433
+ 1
434
+ 1
435
+ 1
436
+ 1
437
+ 1
438
+ 1
439
+ 2
440
+ 1
441
+ 1
442
+ 1
443
+ 1
444
+ 1
445
+ 1
446
+ 1
447
+ 1
448
+ 1
449
+ 1
450
+ 1
451
+ 1
452
+ 1
453
+ 1
454
+ 1
455
+ 1
456
+ 1
457
+ 1
458
+ 1
459
+ 1
460
+ 1
461
+ 1
462
+ 1
463
+ 1
464
+ 1
465
+ 1
466
+ 1
467
+ 1
468
+ 1
469
+ 2
470
+ 1
471
+ 1
472
+ 1
473
+ 1
474
+ 1
475
+ 1
476
+ 1
477
+ 2
478
+ 1
479
+ 1
480
+ 1
481
+ 1
482
+ 1
483
+ 1
484
+ 1
485
+ 1
486
+ 1
487
+ 1
488
+ 1
489
+ 1
490
+ 1
491
+ 1
492
+ 1
493
+ 1
494
+ 1
495
+ 2
496
+ 1
497
+ 1
498
+ 1
499
+ 1
500
+ 1
501
+ 1
502
+ 1
503
+ 1
504
+ 1
505
+ 1
506
+ 1
507
+ 1
508
+ 1
509
+ 1
510
+ 2
511
+ 1
512
+ 1
513
+ 1
514
+ 1
515
+ 1
516
+ 1
517
+ 1
518
+ 1
519
+ 1
520
+ 1
521
+ 1
522
+ 1
523
+ 1
524
+ 1
525
+ 1
526
+ 1
527
+ 1
528
+ 1
529
+ 2
530
+ 1
531
+ 1
532
+ 2
533
+ 1
534
+ 1
535
+ 1
536
+ 1
537
+ 1
538
+ 1
539
+ 1
540
+ 1
541
+ 1
542
+ 1
543
+ 1
544
+ 1
545
+ 1
546
+ 1
547
+ 1
548
+ 1
549
+ 1
550
+ 1
551
+ 1
552
+ 1
553
+ 1
554
+ 1
555
+ 1
556
+ 1
557
+ 1
558
+ 1
559
+ 1
560
+ 1
561
+ 1
562
+ 1
563
+ 1
564
+ 1
565
+ 1
566
+ 1
567
+ 1
568
+ 1
569
+ 1
570
+ 1
571
+ 1
572
+ 1
573
+ 2
574
+ 1
575
+ 1
576
+ 1
577
+ 1
578
+ 1
579
+ 1
580
+ 1
581
+ 1
582
+ 2
583
+ 1
584
+ 2
585
+ 1
586
+ 1
587
+ 1
588
+ 1
589
+ 2
590
+ 1
591
+ 1
592
+ 1
593
+ 1
594
+ 2
595
+ 1
596
+ 1
597
+ 1
598
+ 1
599
+ 1
600
+ 1
601
+ 1
602
+ 1
603
+ 1
604
+ 1
605
+ 1
606
+ 1
607
+ 1
608
+ 1
609
+ 1
610
+ 1
611
+ 1
612
+ 1
613
+ 1
614
+ 1
615
+ 1
616
+ 1
617
+ 1
618
+ 1
619
+ 1
620
+ 1
621
+ 1
622
+ 1
623
+ 1
624
+ 1
625
+ 1
626
+ 1
627
+ 1
628
+ 1
629
+ 1
630
+ 1
631
+ 1
632
+ 1
633
+ 1
634
+ 1
635
+ 1
636
+ 1
637
+ 1
638
+ 1
639
+ 1
640
+ 1
641
+ 1
642
+ 1
643
+ 1
644
+ 1
645
+ 1
646
+ 1
647
+ 1
648
+ 1
649
+ 1
650
+ 1
651
+ 1
652
+ 1
653
+ 1
654
+ 1
655
+ 1
656
+ 1
657
+ 1
658
+ 1
659
+ 1
660
+ 1
661
+ 1
662
+ 1
663
+ 1
664
+ 1
665
+ 1
666
+ 1
667
+ 1
668
+ 1
669
+ 1
670
+ 1
671
+ 1
672
+ 1
673
+ 1
674
+ 1
675
+ 1
676
+ 1
677
+ 1
678
+ 1
679
+ 1
680
+ 1
681
+ 1
682
+ 2
683
+ 1
684
+ 1
685
+ 1
686
+ 1
687
+ 1
688
+ 1
689
+ 2
690
+ 1
691
+ 1
692
+ 1
693
+ 1
694
+ 1
695
+ 1
696
+ 1
697
+ 2
698
+ 1
699
+ 1
700
+ 1
701
+ 1
702
+ 1
703
+ 1
704
+ 1
705
+ 1
706
+ 1
707
+ 1
708
+ 1
709
+ 1
710
+ 1
711
+ 1
712
+ 1
713
+ 1
714
+ 1
715
+ 2
716
+ 1
717
+ 1
718
+ 1
719
+ 1
720
+ 1
721
+ 1
722
+ 1
723
+ 1
724
+ 1
725
+ 1
726
+ 1
727
+ 1
728
+ 1
729
+ 1
730
+ 1
731
+ 1
732
+ 1
733
+ 1
734
+ 1
735
+ 1
736
+ 1
737
+ 1
738
+ 1
739
+ 1
740
+ 1
741
+ 1
742
+ 1
743
+ 1
744
+ 1
745
+ 1
746
+ 1
747
+ 1
748
+ 1
749
+ 1
750
+ 1
751
+ 1
752
+ 1
753
+ 1
754
+ 1
755
+ 1
756
+ 1
757
+ 1
758
+ 1
759
+ 1
760
+ 1
761
+ 1
762
+ 1
763
+ 1
764
+ 1
765
+ 1
766
+ 1
767
+ 1
768
+ 2
769
+ 1
770
+ 1
771
+ 1
772
+ 1
773
+ 1
774
+ 1
775
+ 1
776
+ 1
777
+ 1
778
+ 1
779
+ 1
780
+ 1
781
+ 1
782
+ 1
783
+ 1
784
+ 1
785
+ 1
786
+ 1
787
+ 2
788
+ 1
789
+ 1
790
+ 1
791
+ 1
792
+ 1
793
+ 1
794
+ 1
795
+ 1
796
+ 1
797
+ 1
798
+ 1
799
+ 1
800
+ 1
801
+ 1
802
+ 1
803
+ 1
804
+ 1
805
+ 1
806
+ 1
807
+ 1
808
+ 1
809
+ 1
810
+ 1
811
+ 2
812
+ 1
813
+ 1
814
+ 1
815
+ 1
816
+ 1
817
+ 1
818
+ 1
819
+ 1
820
+ 1
821
+ 1
822
+ 1
823
+ 1
824
+ 1
825
+ 1
826
+ 2
827
+ 1
828
+ 1
829
+ 1
830
+ 1
831
+ 1
832
+ 1
833
+ 1
834
+ 1
835
+ 1
836
+ 1
837
+ 2
838
+ 1
839
+ 1
840
+ 1
841
+ 1
842
+ 2
843
+ 1
844
+ 1
845
+ 1
846
+ 1
847
+ 1
848
+ 1
849
+ 1
850
+ 1
851
+ 1
852
+ 1
853
+ 1
854
+ 1
855
+ 1
856
+ 1
857
+ 1
858
+ 1
859
+ 1
860
+ 1
861
+ 1
862
+ 1
863
+ 1
864
+ 1
865
+ 1
866
+ 1
867
+ 1
868
+ 1
869
+ 1
870
+ 1
871
+ 1
872
+ 1
873
+ 1
874
+ 1
875
+ 1
876
+ 1
877
+ 1
878
+ 1
879
+ 1
880
+ 1
881
+ 1
882
+ 1
883
+ 1
884
+ 2
885
+ 1
886
+ 1
887
+ 1
888
+ 1
889
+ 1
890
+ 1
891
+ 1
892
+ 1
893
+ 1
894
+ 1
895
+ 1
896
+ 1
897
+ 1
898
+ 1
899
+ 1
900
+ 1
901
+ 1
902
+ 1
903
+ 1
904
+ 1
905
+ 1
906
+ 1
907
+ 1
908
+ 1
909
+ 1
910
+ 1
911
+ 1
912
+ 1
913
+ 1
914
+ 1
915
+ 1
916
+ 1
917
+ 1
918
+ 2
919
+ 1
920
+ 1
921
+ 1
922
+ 1
923
+ 1
924
+ 1
925
+ 1
926
+ 1
927
+ 1
928
+ 1
929
+ 1
930
+ 1
931
+ 1
932
+ 1
933
+ 1
934
+ 1
935
+ 1
936
+ 1
937
+ 1
938
+ 2
939
+ 1
940
+ 1
941
+ 1
942
+ 1
943
+ 2
944
+ 1
945
+ 1
946
+ 1
947
+ 1
948
+ 1
949
+ 1
950
+ 1
951
+ 1
952
+ 1
953
+ 1
954
+ 1
955
+ 1
956
+ 1
957
+ 1
958
+ 1
959
+ 1
960
+ 1
961
+ 1
962
+ 1
963
+ 1
964
+ 1
965
+ 1
966
+ 1
967
+ 1
968
+ 1
969
+ 1
970
+ 1
971
+ 2
972
+ 1
973
+ 1
974
+ 1
975
+ 2
976
+ 1
977
+ 1
978
+ 1
979
+ 1
980
+ 1
981
+ 2
982
+ 1
983
+ 1
984
+ 1
985
+ 1
986
+ 1
987
+ 1
988
+ 1
989
+ 1
990
+ 1
991
+ 1
992
+ 1
993
+ 1
994
+ 1
995
+ 1
996
+ 1
997
+ 1
998
+ 1
999
+ 1
1000
+ 1
1001
+ 1
1002
+ 1
1003
+ 1
1004
+ 1
1005
+ 1
1006
+ 1
1007
+ 1
1008
+ 1
1009
+ 1
1010
+ 1
1011
+ 1
1012
+ 1
1013
+ 1
1014
+ 1
1015
+ 1
1016
+ 1
1017
+ 2
1018
+ 1
1019
+ 1
1020
+ 1
1021
+ 1
1022
+ 1
1023
+ 1
1024
+ 1
1025
+ 1
1026
+ 1
1027
+ 1
1028
+ 1
1029
+ 1
1030
+ 1
1031
+ 1
1032
+ 1
1033
+ 1
1034
+ 1
1035
+ 1
1036
+ 1
1037
+ 1
1038
+ 1
1039
+ 1
1040
+ 1
1041
+ 1
1042
+ 1
1043
+ 1
1044
+ 2
1045
+ 1
1046
+ 1
1047
+ 1
1048
+ 1
1049
+ 1
1050
+ 1
1051
+ 1
1052
+ 1
1053
+ 1
1054
+ 1
1055
+ 1
1056
+ 1
1057
+ 1
1058
+ 1
1059
+ 1
1060
+ 1
1061
+ 1
1062
+ 1
1063
+ 1
1064
+ 1
1065
+ 2
1066
+ 1
1067
+ 1
1068
+ 1
1069
+ 1
1070
+ 1
1071
+ 1
1072
+ 1
1073
+ 1
1074
+ 1
1075
+ 1
1076
+ 1
1077
+ 1
1078
+ 1
1079
+ 1
1080
+ 1
1081
+ 1
1082
+ 1
1083
+ 1
1084
+ 1
1085
+ 1
1086
+ 1
1087
+ 1
1088
+ 1
1089
+ 1
1090
+ 1
1091
+ 1
1092
+ 1
1093
+ 1
1094
+ 1
1095
+ 1
1096
+ 1
1097
+ 1
1098
+ 1
1099
+ 1
1100
+ 1
1101
+ 1
1102
+ 1
1103
+ 1
1104
+ 1
1105
+ 1
1106
+ 1
1107
+ 1
1108
+ 1
1109
+ 1
1110
+ 1
1111
+ 1
1112
+ 1
1113
+ 1
1114
+ 1
1115
+ 1
1116
+ 1
1117
+ 1
1118
+ 1
1119
+ 2
1120
+ 1
1121
+ 1
1122
+ 2
1123
+ 1
1124
+ 1
1125
+ 1
1126
+ 1
1127
+ 1
1128
+ 1
1129
+ 1
1130
+ 1
1131
+ 1
1132
+ 1
1133
+ 1
1134
+ 2
1135
+ 1
1136
+ 1
1137
+ 1
1138
+ 1
1139
+ 1
1140
+ 1
1141
+ 1
1142
+ 1
1143
+ 1
1144
+ 1
1145
+ 1
1146
+ 1
1147
+ 1
1148
+ 1
1149
+ 1
1150
+ 1
1151
+ 1
1152
+ 1
1153
+ 1
1154
+ 2
1155
+ 1
1156
+ 2
1157
+ 1
1158
+ 1
1159
+ 2
1160
+ 2
1161
+ 1
1162
+ 1
1163
+ 1
1164
+ 1
1165
+ 1
1166
+ 1
1167
+ 1
1168
+ 1
1169
+ 1
1170
+ 1
1171
+ 1
1172
+ 1
1173
+ 1
1174
+ 2
1175
+ 1
1176
+ 1
1177
+ 1
1178
+ 1
1179
+ 1
1180
+ 1
1181
+ 1
1182
+ 1
1183
+ 1
1184
+ 1
1185
+ 1
1186
+ 1
1187
+ 1
1188
+ 2
1189
+ 1
1190
+ 1
1191
+ 1
1192
+ 1
1193
+ 1
1194
+ 1
1195
+ 1
1196
+ 1
1197
+ 1
1198
+ 1
1199
+ 1
1200
+ 1
1201
+ 1
1202
+ 1
1203
+ 1
1204
+ 1
1205
+ 1
1206
+ 1
1207
+ 1
1208
+ 1
1209
+ 1
1210
+ 1
1211
+ 1
1212
+ 1
1213
+ 1
1214
+ 1
1215
+ 1
1216
+ 1
1217
+ 1
1218
+ 1
1219
+ 1
1220
+ 2
1221
+ 1
1222
+ 1
1223
+ 1
1224
+ 1
1225
+ 1
1226
+ 1
1227
+ 1
1228
+ 1
1229
+ 1
1230
+ 1
1231
+ 1
1232
+ 1
1233
+ 1
1234
+ 1
1235
+ 1
1236
+ 1
1237
+ 1
1238
+ 2
1239
+ 2
1240
+ 1
1241
+ 1
1242
+ 1
1243
+ 1
1244
+ 1
1245
+ 1
1246
+ 1
1247
+ 1
1248
+ 1
1249
+ 1
1250
+ 1
1251
+ 1
1252
+ 1
1253
+ 1
1254
+ 1
1255
+ 1
1256
+ 1
1257
+ 1
1258
+ 1
1259
+ 1
1260
+ 2
1261
+ 1
1262
+ 1
1263
+ 1
1264
+ 1
1265
+ 1
1266
+ 1
1267
+ 2
1268
+ 1
1269
+ 1
1270
+ 1
1271
+ 1
1272
+ 1
1273
+ 1
1274
+ 1
1275
+ 1
1276
+ 1
1277
+ 1
1278
+ 1
1279
+ 2
1280
+ 1
1281
+ 1
1282
+ 1
1283
+ 1
1284
+ 1
1285
+ 1
1286
+ 1
1287
+ 1
1288
+ 1
1289
+ 1
1290
+ 1
1291
+ 1
1292
+ 1
1293
+ 1
1294
+ 1
1295
+ 1
1296
+ 1
1297
+ 2
1298
+ 1
1299
+ 1
1300
+ 1
1301
+ 1
1302
+ 1
1303
+ 1
1304
+ 1
1305
+ 1
1306
+ 1
1307
+ 1
1308
+ 1
1309
+ 1
1310
+ 1
1311
+ 1
1312
+ 1
1313
+ 1
1314
+ 1
1315
+ 1
1316
+ 1
1317
+ 1
1318
+ 1
1319
+ 1
1320
+ 1
1321
+ 1
1322
+ 1
1323
+ 1
1324
+ 1
1325
+ 1
1326
+ 1
1327
+ 1
1328
+ 1
1329
+ 1
1330
+ 1
1331
+ 1
1332
+ 1
1333
+ 1
1334
+ 1
1335
+ 1
1336
+ 1
1337
+ 1
1338
+ 1
1339
+ 1
1340
+ 1
1341
+ 1
1342
+ 1
1343
+ 1
1344
+ 1
1345
+ 1
1346
+ 1
1347
+ 1
1348
+ 1
1349
+ 1
1350
+ 1
1351
+ 1
1352
+ 1
1353
+ 1
1354
+ 1
1355
+ 2
1356
+ 1
1357
+ 1
1358
+ 1
1359
+ 1
1360
+ 1
1361
+ 1
1362
+ 1
1363
+ 1
1364
+ 1
1365
+ 1
1366
+ 1
1367
+ 1
1368
+ 1
1369
+ 1
1370
+ 1
1371
+ 1
1372
+ 1
1373
+ 1
1374
+ 1
1375
+ 1
1376
+ 1
1377
+ 1
1378
+ 1
1379
+ 2
1380
+ 1
1381
+ 1
1382
+ 1
1383
+ 1
1384
+ 1
1385
+ 1
1386
+ 1
1387
+ 1
1388
+ 2
1389
+ 1
1390
+ 1
1391
+ 1
1392
+ 1
1393
+ 1
1394
+ 1
1395
+ 1
1396
+ 1
1397
+ 1
1398
+ 1
1399
+ 1
1400
+ 1
1401
+ 1
1402
+ 1
1403
+ 1
1404
+ 1
1405
+ 1
1406
+ 1
1407
+ 1
1408
+ 1
1409
+ 1
1410
+ 1
1411
+ 1
1412
+ 1
1413
+ 1
1414
+ 1
1415
+ 1
1416
+ 1
1417
+ 1
1418
+ 1
1419
+ 1
1420
+ 1
1421
+ 1
1422
+ 1
1423
+ 1
1424
+ 1
1425
+ 1
1426
+ 1
1427
+ 1
1428
+ 1
1429
+ 1
1430
+ 1
1431
+ 1
1432
+ 1
1433
+ 1
1434
+ 1
1435
+ 1
1436
+ 1
1437
+ 1
1438
+ 1
1439
+ 1
1440
+ 1
1441
+ 1
1442
+ 1
1443
+ 1
1444
+ 1
1445
+ 1
1446
+ 1
1447
+ 1
1448
+ 1
1449
+ 1
1450
+ 1
1451
+ 1
1452
+ 1
1453
+ 1
1454
+ 1
1455
+ 1
1456
+ 1
1457
+ 1
1458
+ 1
1459
+ 1
1460
+ 1
1461
+ 1
1462
+ 1
1463
+ 1
1464
+ 1
1465
+ 1
1466
+ 1
1467
+ 1
1468
+ 1
1469
+ 1
1470
+ 1
1471
+ 1
1472
+ 1
1473
+ 1
1474
+ 1
1475
+ 1
1476
+ 1
1477
+ 1
1478
+ 1
1479
+ 1
1480
+ 1
1481
+ 1
1482
+ 1
1483
+ 1
1484
+ 1
1485
+ 1
1486
+ 1
1487
+ 1
1488
+ 1
1489
+ 1
1490
+ 1
1491
+ 1
1492
+ 1
1493
+ 1
1494
+ 1
1495
+ 2
1496
+ 1
1497
+ 1
1498
+ 1
1499
+ 1
1500
+ 1
1501
+ 1
1502
+ 1
1503
+ 1
1504
+ 1
1505
+ 1
1506
+ 1
1507
+ 1
1508
+ 1
1509
+ 2
1510
+ 1
1511
+ 1
1512
+ 1
1513
+ 1
1514
+ 1
1515
+ 1
1516
+ 1
1517
+ 1
1518
+ 1
1519
+ 2
1520
+ 1
1521
+ 1
1522
+ 1
1523
+ 1
1524
+ 1
1525
+ 1
1526
+ 1
1527
+ 1
1528
+ 1
1529
+ 1
1530
+ 1
1531
+ 1
1532
+ 1
1533
+ 1
1534
+ 1
1535
+ 1
1536
+ 1
1537
+ 1
1538
+ 1
1539
+ 1
1540
+ 1
1541
+ 1
1542
+ 1
1543
+ 1
1544
+ 1
1545
+ 1
1546
+ 1
1547
+ 1
1548
+ 1
1549
+ 1
1550
+ 1
1551
+ 1
1552
+ 1
1553
+ 1
1554
+ 1
1555
+ 1
1556
+ 1
1557
+ 1
1558
+ 1
1559
+ 1
1560
+ 1
1561
+ 1
1562
+ 1
1563
+ 1
1564
+ 1
1565
+ 1
1566
+ 1
1567
+ 1
1568
+ 1
1569
+ 1
1570
+ 1
1571
+ 1
1572
+ 1
1573
+ 1
1574
+ 1
1575
+ 2
1576
+ 1
1577
+ 1
1578
+ 1
1579
+ 1
1580
+ 1
1581
+ 1
1582
+ 1
1583
+ 1
1584
+ 1
1585
+ 1
1586
+ 1
1587
+ 1
1588
+ 1
1589
+ 1
1590
+ 1
1591
+ 1
1592
+ 1
1593
+ 1
1594
+ 1
1595
+ 1
1596
+ 1
1597
+ 1
1598
+ 1
1599
+ 1
1600
+ 1
1601
+ 1
1602
+ 2
1603
+ 1
1604
+ 1
1605
+ 1
1606
+ 1
1607
+ 1
1608
+ 1
1609
+ 1
1610
+ 1
1611
+ 1
1612
+ 1
1613
+ 1
1614
+ 1
1615
+ 2
1616
+ 1
1617
+ 1
1618
+ 1
1619
+ 1
1620
+ 1
1621
+ 1
1622
+ 1
1623
+ 1
1624
+ 1
1625
+ 1
1626
+ 1
1627
+ 1
1628
+ 1
1629
+ 1
1630
+ 1
1631
+ 1
1632
+ 1
1633
+ 1
1634
+ 1
1635
+ 1
1636
+ 1
1637
+ 1
1638
+ 1
1639
+ 1
1640
+ 1
1641
+ 1
1642
+ 1
1643
+ 1
1644
+ 1
1645
+ 1
1646
+ 1
1647
+ 1
1648
+ 1
1649
+ 1
1650
+ 1
1651
+ 1
1652
+ 1
1653
+ 1
1654
+ 1
1655
+ 1
1656
+ 1
1657
+ 1
1658
+ 1
1659
+ 1
1660
+ 1
1661
+ 1
1662
+ 1
1663
+ 1
1664
+ 1
1665
+ 1
1666
+ 1
1667
+ 1
1668
+ 1
1669
+ 2
1670
+ 1
1671
+ 1
1672
+ 1
1673
+ 1
1674
+ 2
1675
+ 1
1676
+ 1
1677
+ 1
1678
+ 1
1679
+ 1
1680
+ 1
1681
+ 1
1682
+ 1
1683
+ 1
1684
+ 1
1685
+ 1
1686
+ 1
1687
+ 1
1688
+ 1
1689
+ 1
1690
+ 1
1691
+ 1
1692
+ 1
1693
+ 1
1694
+ 1
1695
+ 1
1696
+ 1
1697
+ 1
1698
+ 1
1699
+ 1
1700
+ 2
1701
+ 1
1702
+ 1
1703
+ 1
1704
+ 1
1705
+ 1
1706
+ 1
1707
+ 1
1708
+ 1
1709
+ 1
1710
+ 1
1711
+ 1
1712
+ 1
1713
+ 2
1714
+ 1
1715
+ 2
1716
+ 1
1717
+ 1
1718
+ 1
1719
+ 1
1720
+ 1
1721
+ 1
1722
+ 1
1723
+ 1
1724
+ 1
1725
+ 1
1726
+ 1
1727
+ 1
1728
+ 1
1729
+ 1
1730
+ 1
1731
+ 1
1732
+ 1
1733
+ 1
1734
+ 1
1735
+ 1
1736
+ 1
1737
+ 1
1738
+ 2
1739
+ 1
1740
+ 1
1741
+ 1
1742
+ 1
1743
+ 1
1744
+ 1
1745
+ 1
1746
+ 1
1747
+ 1
1748
+ 1
1749
+ 1
1750
+ 1
1751
+ 1
1752
+ 1
1753
+ 1
1754
+ 1
1755
+ 1
1756
+ 1
1757
+ 1
1758
+ 1
1759
+ 1
1760
+ 1
1761
+ 1
1762
+ 1
1763
+ 1
1764
+ 1
1765
+ 1
1766
+ 1
1767
+ 1
1768
+ 1
1769
+ 1
1770
+ 1
1771
+ 1
1772
+ 1
1773
+ 1
1774
+ 1
1775
+ 1
1776
+ 1
1777
+ 1
1778
+ 1
1779
+ 1
1780
+ 1
1781
+ 1
1782
+ 1
1783
+ 1
1784
+ 1
1785
+ 1
1786
+ 1
1787
+ 1
1788
+ 1
1789
+ 1
1790
+ 1
1791
+ 1
1792
+ 1
1793
+ 1
1794
+ 1
1795
+ 1
1796
+ 1
1797
+ 1
1798
+ 1
1799
+ 1
1800
+ 1
1801
+ 1
1802
+ 1
1803
+ 1
1804
+ 1
1805
+ 1
1806
+ 1
1807
+ 1
1808
+ 1
1809
+ 1
1810
+ 1
1811
+ 1
1812
+ 1
1813
+ 1
1814
+ 1
1815
+ 1
1816
+ 1
1817
+ 1
1818
+ 1
1819
+ 1
1820
+ 1
1821
+ 1
1822
+ 1
1823
+ 1
1824
+ 1
1825
+ 1
1826
+ 1
1827
+ 1
1828
+ 1
1829
+ 1
1830
+ 1
1831
+ 1
1832
+ 1
1833
+ 1
1834
+ 1
1835
+ 1
1836
+ 1
1837
+ 1
1838
+ 1
1839
+ 1
1840
+ 1
1841
+ 1
1842
+ 2
1843
+ 1
1844
+ 1
1845
+ 1
1846
+ 1
1847
+ 1
1848
+ 1
1849
+ 1
1850
+ 1
1851
+ 1
1852
+ 1
1853
+ 1
1854
+ 1
1855
+ 1
1856
+ 1
1857
+ 1
1858
+ 1
1859
+ 1
1860
+ 1
1861
+ 1
1862
+ 1
1863
+ 1
1864
+ 1
1865
+ 1
1866
+ 1
1867
+ 1
1868
+ 1
1869
+ 1
1870
+ 1
1871
+ 1
1872
+ 1
1873
+ 2
1874
+ 1
1875
+ 1
1876
+ 1
1877
+ 1
1878
+ 1
1879
+ 1
1880
+ 2
1881
+ 1
1882
+ 1
1883
+ 1
1884
+ 1
1885
+ 1
1886
+ 1
1887
+ 1
1888
+ 1
1889
+ 1
1890
+ 1
1891
+ 1
1892
+ 1
1893
+ 1
1894
+ 1
1895
+ 1
1896
+ 1
1897
+ 1
1898
+ 1
1899
+ 1
1900
+ 1
1901
+ 1
1902
+ 2
1903
+ 1
1904
+ 1
1905
+ 1
1906
+ 1
1907
+ 1
1908
+ 1
1909
+ 1
1910
+ 1
1911
+ 1
1912
+ 1
1913
+ 1
1914
+ 1
1915
+ 1
1916
+ 1
1917
+ 1
1918
+ 1
1919
+ 1
1920
+ 1
1921
+ 1
1922
+ 2
1923
+ 1
1924
+ 1
1925
+ 1
1926
+ 1
1927
+ 1
1928
+ 1
1929
+ 1
1930
+ 1
1931
+ 1
1932
+ 1
1933
+ 1
1934
+ 1
1935
+ 2
1936
+ 1
1937
+ 1
1938
+ 1
1939
+ 1
1940
+ 1
1941
+ 1
1942
+ 1
1943
+ 1
1944
+ 1
1945
+ 1
1946
+ 1
1947
+ 1
1948
+ 1
1949
+ 1
1950
+ 1
1951
+ 1
1952
+ 1
1953
+ 1
1954
+ 1
1955
+ 1
1956
+ 1
1957
+ 1
1958
+ 1
1959
+ 1
1960
+ 1
1961
+ 1
1962
+ 2
1963
+ 1
1964
+ 1
1965
+ 1
1966
+ 1
1967
+ 1
1968
+ 2
1969
+ 1
1970
+ 1
1971
+ 1
1972
+ 1
1973
+ 1
1974
+ 1
1975
+ 1
1976
+ 1
1977
+ 1
1978
+ 1
1979
+ 2
1980
+ 1
1981
+ 1
1982
+ 1
1983
+ 1
1984
+ 1
1985
+ 1
1986
+ 1
1987
+ 1
1988
+ 1
1989
+ 1
1990
+ 1
1991
+ 1
1992
+ 1
1993
+ 1
1994
+ 1
1995
+ 1
1996
+ 1
1997
+ 1
1998
+ 1
1999
+ 1
2000
+ 1
2001
+ 1
2002
+ 1
2003
+ 1
2004
+ 1
2005
+ 1
2006
+ 1
2007
+ 1
2008
+ 1
2009
+ 1
2010
+ 1
2011
+ 1
2012
+ 1
2013
+ 1
2014
+ 1
2015
+ 1
2016
+ 1
2017
+ 1
2018
+ 1
2019
+ 2
2020
+ 1
2021
+ 1
2022
+ 1
2023
+ 1
2024
+ 1
2025
+ 1
2026
+ 1
2027
+ 1
2028
+ 1
2029
+ 1
2030
+ 1
2031
+ 2
2032
+ 1
2033
+ 1
2034
+ 1
2035
+ 1
2036
+ 1
2037
+ 1
2038
+ 1
2039
+ 1
2040
+ 2
2041
+ 1
2042
+ 1
2043
+ 1
2044
+ 2
2045
+ 1
2046
+ 1
2047
+ 1
2048
+ 1
2049
+ 1
2050
+ 1
2051
+ 1
2052
+ 1
2053
+ 1
2054
+ 1
2055
+ 1
2056
+ 1
2057
+ 1
2058
+ 1
2059
+ 1
2060
+ 1
2061
+ 1
2062
+ 2
2063
+ 1
2064
+ 1
2065
+ 1
2066
+ 1
2067
+ 1
2068
+ 1
2069
+ 1
2070
+ 1
2071
+ 1
2072
+ 1
2073
+ 1
2074
+ 1
2075
+ 1
2076
+ 1
2077
+ 1
2078
+ 1
2079
+ 1
2080
+ 1
2081
+ 1
2082
+ 1
2083
+ 1
2084
+ 1
2085
+ 1
2086
+ 1
2087
+ 1
2088
+ 1
2089
+ 1
2090
+ 1
2091
+ 1
2092
+ 1
2093
+ 1
2094
+ 1
2095
+ 1
2096
+ 1
2097
+ 1
2098
+ 1
2099
+ 1
2100
+ 1
2101
+ 1
2102
+ 1
2103
+ 1
2104
+ 1
2105
+ 1
2106
+ 1
2107
+ 1
2108
+ 1
2109
+ 1
2110
+ 1
2111
+ 1
2112
+ 1
2113
+ 1
2114
+ 2
2115
+ 1
2116
+ 1
2117
+ 1
2118
+ 1
2119
+ 1
2120
+ 1
2121
+ 1
2122
+ 1
2123
+ 1
2124
+ 1
2125
+ 1
2126
+ 1
2127
+ 1
2128
+ 1
2129
+ 1
2130
+ 1
2131
+ 1
2132
+ 1
2133
+ 1
2134
+ 1
2135
+ 1
2136
+ 1
2137
+ 1
2138
+ 1
2139
+ 1
2140
+ 1
2141
+ 1
2142
+ 1
2143
+ 1
2144
+ 1
2145
+ 1
2146
+ 1
2147
+ 1
2148
+ 1
2149
+ 1
2150
+ 1
2151
+ 1
2152
+ 1
2153
+ 1
2154
+ 1
2155
+ 1
2156
+ 1
2157
+ 1
2158
+ 1
2159
+ 1
2160
+ 1
2161
+ 1
2162
+ 1
2163
+ 1
2164
+ 1
2165
+ 1
2166
+ 1
2167
+ 1
2168
+ 1
2169
+ 1
2170
+ 1
2171
+ 1
2172
+ 1
2173
+ 1
2174
+ 1
2175
+ 1
2176
+ 1
2177
+ 1
2178
+ 1
2179
+ 1
2180
+ 1
2181
+ 1
2182
+ 1
2183
+ 1
2184
+ 1
2185
+ 1
2186
+ 1
2187
+ 1
2188
+ 1
2189
+ 1
2190
+ 1
2191
+ 1
2192
+ 1
2193
+ 1
2194
+ 1
2195
+ 1
2196
+ 1
2197
+ 1
2198
+ 1
2199
+ 1
2200
+ 1
2201
+ 1
2202
+ 1
2203
+ 1
2204
+ 1
2205
+ 2
2206
+ 1
2207
+ 1
2208
+ 1
2209
+ 1
2210
+ 1
2211
+ 1
2212
+ 1
2213
+ 1
2214
+ 1
2215
+ 1
2216
+ 1
2217
+ 2
2218
+ 1
2219
+ 1
2220
+ 1
2221
+ 1
2222
+ 1
2223
+ 1
2224
+ 1
2225
+ 1
2226
+ 1
2227
+ 1
2228
+ 1
2229
+ 1
2230
+ 1
2231
+ 1
2232
+ 1
2233
+ 1
2234
+ 1
2235
+ 1
2236
+ 1
2237
+ 2
2238
+ 1
2239
+ 1
2240
+ 1
2241
+ 1
2242
+ 1
2243
+ 1
2244
+ 1
2245
+ 1
2246
+ 1
2247
+ 1
2248
+ 1
2249
+ 1
2250
+ 1
2251
+ 2
2252
+ 1
2253
+ 1
2254
+ 1
2255
+ 1
2256
+ 1
2257
+ 1
2258
+ 1
2259
+ 1
2260
+ 1
2261
+ 1
2262
+ 1
2263
+ 1
2264
+ 1
2265
+ 1
2266
+ 1
2267
+ 1
2268
+ 1
2269
+ 1
2270
+ 1
2271
+ 1
2272
+ 1
2273
+ 1
2274
+ 1
2275
+ 2
2276
+ 1
2277
+ 1
2278
+ 1
2279
+ 1
2280
+ 1
2281
+ 1
2282
+ 1
2283
+ 1
2284
+ 1
2285
+ 1
2286
+ 1
2287
+ 1
2288
+ 1
2289
+ 1
2290
+ 1
2291
+ 1
2292
+ 1
2293
+ 2
2294
+ 1
2295
+ 1
2296
+ 1
2297
+ 1
2298
+ 1
2299
+ 1
2300
+ 1
2301
+ 1
2302
+ 1
2303
+ 1
2304
+ 1
2305
+ 1
2306
+ 1
2307
+ 1
2308
+ 1
2309
+ 1
2310
+ 1
2311
+ 2
2312
+ 1
2313
+ 1
2314
+ 1
2315
+ 1
2316
+ 1
2317
+ 1
2318
+ 1
2319
+ 1
2320
+ 1
2321
+ 1
2322
+ 1
2323
+ 1
2324
+ 1
2325
+ 1
2326
+ 1
2327
+ 1
2328
+ 1
2329
+ 1
2330
+ 1
2331
+ 1
2332
+ 1
2333
+ 1
2334
+ 1
2335
+ 1
2336
+ 1
2337
+ 1
2338
+ 1
2339
+ 1
2340
+ 1
2341
+ 1
2342
+ 1
2343
+ 2
2344
+ 1
2345
+ 1
2346
+ 1
2347
+ 1
2348
+ 1
2349
+ 1
2350
+ 1
2351
+ 1
2352
+ 1
2353
+ 1
2354
+ 1
2355
+ 1
2356
+ 1
2357
+ 1
2358
+ 1
2359
+ 1
2360
+ 2
2361
+ 1
2362
+ 1
2363
+ 1
2364
+ 1
2365
+ 1
2366
+ 1
2367
+ 1
2368
+ 1
2369
+ 1
2370
+ 1
2371
+ 1
2372
+ 1
2373
+ 1
2374
+ 1
2375
+ 2
2376
+ 1
2377
+ 1
2378
+ 1
2379
+ 1
2380
+ 1
2381
+ 1
2382
+ 1
2383
+ 2
2384
+ 1
2385
+ 1
2386
+ 1
2387
+ 1
2388
+ 1
2389
+ 1
2390
+ 1
2391
+ 1
2392
+ 1
2393
+ 1
2394
+ 1
2395
+ 1
2396
+ 1
2397
+ 1
2398
+ 1
2399
+ 1
2400
+ 2
2401
+ 1
2402
+ 1
2403
+ 1
2404
+ 1
2405
+ 1
2406
+ 1
2407
+ 1
2408
+ 1
2409
+ 1
2410
+ 1
2411
+ 1
2412
+ 1
2413
+ 1
2414
+ 1
2415
+ 1
2416
+ 2
2417
+ 1
2418
+ 1
2419
+ 1
2420
+ 2
2421
+ 1
2422
+ 1
2423
+ 1
2424
+ 1
2425
+ 1
2426
+ 1
2427
+ 1
2428
+ 1
2429
+ 1
2430
+ 1
2431
+ 1
2432
+ 1
2433
+ 1
2434
+ 1
2435
+ 1
2436
+ 1
2437
+ 1
2438
+ 1
2439
+ 1
2440
+ 1
2441
+ 1
2442
+ 1
2443
+ 1
2444
+ 1
2445
+ 1
2446
+ 1
2447
+ 1
2448
+ 1
2449
+ 1
2450
+ 1
2451
+ 1
2452
+ 1
2453
+ 1
2454
+ 1
2455
+ 1
2456
+ 1
2457
+ 1
2458
+ 1
2459
+ 1
2460
+ 1
2461
+ 1
2462
+ 1
2463
+ 1
2464
+ 1
2465
+ 1
2466
+ 1
2467
+ 1
2468
+ 1
2469
+ 1
2470
+ 1
2471
+ 1
2472
+ 1
2473
+ 1
2474
+ 1
2475
+ 1
2476
+ 1
2477
+ 1
2478
+ 1
2479
+ 1
2480
+ 1
2481
+ 1
2482
+ 1
2483
+ 1
2484
+ 2
2485
+ 1
2486
+ 1
2487
+ 1
2488
+ 1
2489
+ 1
2490
+ 1
2491
+ 1
2492
+ 1
2493
+ 1
2494
+ 1
2495
+ 1
2496
+ 1
2497
+ 1
2498
+ 1
2499
+ 1
2500
+ 1
2501
+ 1
2502
+ 1
2503
+ 2
2504
+ 1
2505
+ 2
2506
+ 1
2507
+ 1
2508
+ 1
2509
+ 1
2510
+ 1
2511
+ 1
2512
+ 1
2513
+ 1
2514
+ 1
2515
+ 1
2516
+ 1
2517
+ 1
2518
+ 1
2519
+ 1
2520
+ 1
2521
+ 1
2522
+ 1
2523
+ 1
2524
+ 1
2525
+ 1
2526
+ 1
2527
+ 1
2528
+ 1
2529
+ 1
2530
+ 1
2531
+ 1
2532
+ 1
2533
+ 1
2534
+ 1
2535
+ 1
2536
+ 1
2537
+ 1
2538
+ 1
2539
+ 1
2540
+ 1
2541
+ 1
2542
+ 1
2543
+ 1
2544
+ 1
2545
+ 1
2546
+ 1
2547
+ 1
2548
+ 1
2549
+ 1
2550
+ 1
2551
+ 1
2552
+ 1
2553
+ 1
2554
+ 1
2555
+ 1
2556
+ 1
2557
+ 1
2558
+ 1
2559
+ 1
2560
+ 1
2561
+ 1
2562
+ 1
2563
+ 1
2564
+ 1
2565
+ 1
2566
+ 1
2567
+ 1
2568
+ 1
2569
+ 1
2570
+ 1
2571
+ 1
2572
+ 1
2573
+ 1
2574
+ 1
2575
+ 1
2576
+ 1
2577
+ 2
2578
+ 1
2579
+ 1
2580
+ 1
2581
+ 1
2582
+ 1
2583
+ 1
2584
+ 1
2585
+ 1
2586
+ 1
2587
+ 1
2588
+ 1
2589
+ 1
2590
+ 2
2591
+ 2
2592
+ 1
2593
+ 1
2594
+ 1
2595
+ 1
2596
+ 1
2597
+ 1
2598
+ 1
2599
+ 1
2600
+ 1
2601
+ 1
2602
+ 1
2603
+ 1
2604
+ 1
2605
+ 1
2606
+ 1
2607
+ 1
2608
+ 1
2609
+ 1
2610
+ 1
2611
+ 1
2612
+ 1
2613
+ 1
2614
+ 1
2615
+ 1
2616
+ 1
2617
+ 1
2618
+ 1
2619
+ 1
2620
+ 1
2621
+ 1
2622
+ 1
2623
+ 2
2624
+ 1
2625
+ 2
2626
+ 1
2627
+ 1
2628
+ 1
2629
+ 1
2630
+ 1
2631
+ 1
2632
+ 1
2633
+ 1
2634
+ 1
2635
+ 1
2636
+ 1
2637
+ 2
2638
+ 1
2639
+ 1
2640
+ 1
2641
+ 1
2642
+ 1
2643
+ 1
2644
+ 1
2645
+ 1
2646
+ 1
2647
+ 1
2648
+ 1
2649
+ 1
2650
+ 1
2651
+ 1
2652
+ 2
2653
+ 1
2654
+ 1
2655
+ 1
2656
+ 2
2657
+ 1
2658
+ 1
2659
+ 2
2660
+ 2
2661
+ 1
2662
+ 1
2663
+ 1
2664
+ 1
2665
+ 2
2666
+ 1
2667
+ 1
2668
+ 1
2669
+ 1
2670
+ 1
2671
+ 1
2672
+ 1
2673
+ 2
2674
+ 1
2675
+ 1
2676
+ 1
2677
+ 1
2678
+ 1
2679
+ 1
2680
+ 1
2681
+ 1
2682
+ 1
2683
+ 1
2684
+ 1
2685
+ 1
2686
+ 1
2687
+ 1
2688
+ 1
2689
+ 1
2690
+ 1
2691
+ 1
2692
+ 1
2693
+ 1
2694
+ 1
2695
+ 1
2696
+ 1
2697
+ 1
2698
+ 1
2699
+ 1
2700
+ 1
2701
+ 1
2702
+ 1
2703
+ 1
2704
+ 1
2705
+ 1
2706
+ 1
2707
+ 2
2708
+ 2
2709
+ 1
2710
+ 2
2711
+ 1
2712
+ 1
2713
+ 1
2714
+ 1
2715
+ 1
2716
+ 1
2717
+ 1
2718
+ 1
2719
+ 1
2720
+ 1
2721
+ 1
2722
+ 1
2723
+ 1
2724
+ 1
2725
+ 1
2726
+ 2
2727
+ 1
2728
+ 1
2729
+ 1
2730
+ 1
2731
+ 1
2732
+ 1
2733
+ 2
2734
+ 1
2735
+ 1
2736
+ 1
2737
+ 1
2738
+ 1
2739
+ 1
2740
+ 1
2741
+ 1
2742
+ 1
2743
+ 1
2744
+ 1
2745
+ 1
2746
+ 1
2747
+ 1
2748
+ 1
2749
+ 1
2750
+ 1
2751
+ 1
2752
+ 1
2753
+ 1
2754
+ 1
2755
+ 1
2756
+ 1
2757
+ 1
2758
+ 1
2759
+ 1
2760
+ 1
2761
+ 1
2762
+ 2
2763
+ 1
2764
+ 1
2765
+ 1
2766
+ 1
2767
+ 1
2768
+ 1
2769
+ 1
2770
+ 1
2771
+ 1
2772
+ 1
2773
+ 1
2774
+ 1
2775
+ 1
2776
+ 1
2777
+ 1
2778
+ 1
2779
+ 1
2780
+ 1
2781
+ 1
2782
+ 1
2783
+ 1
2784
+ 1
2785
+ 1
2786
+ 1
2787
+ 1
2788
+ 1
2789
+ 1
2790
+ 1
2791
+ 1
2792
+ 1
2793
+ 1
2794
+ 1
2795
+ 1
2796
+ 1
2797
+ 1
2798
+ 1
2799
+ 1
2800
+ 1
2801
+ 1
2802
+ 1
2803
+ 1
2804
+ 1
2805
+ 1
2806
+ 1
2807
+ 1
2808
+ 1
2809
+ 1
2810
+ 1
2811
+ 1
2812
+ 1
2813
+ 1
2814
+ 1
2815
+ 1
2816
+ 1
2817
+ 1
2818
+ 1
2819
+ 1
2820
+ 1
2821
+ 1
2822
+ 1
2823
+ 1
2824
+ 1
2825
+ 1
2826
+ 1
2827
+ 1
2828
+ 2
2829
+ 1
2830
+ 1
2831
+ 1
2832
+ 1
2833
+ 1
2834
+ 1
2835
+ 1
2836
+ 1
2837
+ 1
2838
+ 1
2839
+ 1
2840
+ 1
2841
+ 1
2842
+ 1
2843
+ 1
2844
+ 1
2845
+ 1
2846
+ 1
2847
+ 1
2848
+ 1
2849
+ 1
2850
+ 1
2851
+ 1
2852
+ 1
2853
+ 1
2854
+ 1
2855
+ 1
2856
+ 1
2857
+ 1
2858
+ 1
2859
+ 1
2860
+ 1
2861
+ 1
2862
+ 1
2863
+ 1
2864
+ 1
2865
+ 2
2866
+ 1
2867
+ 2
2868
+ 1
2869
+ 1
2870
+ 1
2871
+ 1
2872
+ 1
2873
+ 1
2874
+ 1
2875
+ 1
2876
+ 1
2877
+ 1
2878
+ 1
2879
+ 1
2880
+ 1
2881
+ 1
2882
+ 1
2883
+ 1
2884
+ 1
2885
+ 1
2886
+ 1
2887
+ 1
2888
+ 1
2889
+ 1
2890
+ 1
2891
+ 1
2892
+ 1
2893
+ 1
2894
+ 1
2895
+ 1
2896
+ 1
2897
+ 1
2898
+ 1
2899
+ 1
2900
+ 1
2901
+ 1
2902
+ 1
2903
+ 1
2904
+ 1
2905
+ 1
2906
+ 2
2907
+ 1
2908
+ 1
2909
+ 1
2910
+ 1
2911
+ 1
2912
+ 1
2913
+ 1
2914
+ 1
2915
+ 1
2916
+ 1
2917
+ 1
2918
+ 1
2919
+ 1
2920
+ 1
2921
+ 1
2922
+ 1
2923
+ 2
2924
+ 1
2925
+ 1
2926
+ 1
2927
+ 1
2928
+ 1
2929
+ 1
2930
+ 2
2931
+ 1
2932
+ 1
2933
+ 1
2934
+ 1
2935
+ 1
2936
+ 1
2937
+ 1
2938
+ 1
2939
+ 1
2940
+ 1
2941
+ 1
2942
+ 1
2943
+ 1
2944
+ 1
2945
+ 1
2946
+ 1
2947
+ 1
2948
+ 1
2949
+ 1
2950
+ 1
2951
+ 1
2952
+ 1
2953
+ 1
2954
+ 1
2955
+ 1
2956
+ 1
2957
+ 1
2958
+ 1
2959
+ 1
2960
+ 1
2961
+ 1
2962
+ 1
2963
+ 1
2964
+ 1
2965
+ 1
2966
+ 1
2967
+ 2
2968
+ 1
2969
+ 1
2970
+ 1
2971
+ 1
2972
+ 1
2973
+ 2
2974
+ 1
2975
+ 1
2976
+ 1
2977
+ 1
2978
+ 1
2979
+ 1
2980
+ 1
2981
+ 1
2982
+ 1
2983
+ 1
2984
+ 1
2985
+ 1
2986
+ 1
2987
+ 1
2988
+ 1
2989
+ 1
2990
+ 1
2991
+ 1
2992
+ 1
2993
+ 1
2994
+ 2
2995
+ 1
2996
+ 1
2997
+ 1
2998
+ 1
2999
+ 1
3000
+ 1
3001
+ 1
3002
+ 1
3003
+ 1
3004
+ 1
3005
+ 1
3006
+ 1
3007
+ 1
3008
+ 1
3009
+ 1
3010
+ 1
3011
+ 2
3012
+ 1
3013
+ 1
3014
+ 1
3015
+ 1
3016
+ 1
3017
+ 1
3018
+ 1
3019
+ 1
3020
+ 1
3021
+ 1
3022
+ 1
3023
+ 1
3024
+ 1
3025
+ 1
3026
+ 2
3027
+ 1
3028
+ 1
3029
+ 1
3030
+ 1
3031
+ 1
3032
+ 2
3033
+ 1
3034
+ 1
3035
+ 1
3036
+ 1
3037
+ 1
3038
+ 1
3039
+ 1
3040
+ 1
3041
+ 2
3042
+ 2
3043
+ 1
3044
+ 1
3045
+ 1
3046
+ 1
3047
+ 1
3048
+ 1
3049
+ 1
3050
+ 1
3051
+ 1
3052
+ 1
3053
+ 1
3054
+ 1
3055
+ 1
3056
+ 1
3057
+ 1
3058
+ 1
3059
+ 1
3060
+ 1
3061
+ 1
3062
+ 1
3063
+ 1
3064
+ 1
3065
+ 1
3066
+ 1
3067
+ 1
3068
+ 1
3069
+ 1
3070
+ 1
3071
+ 2
3072
+ 1
3073
+ 1
3074
+ 1
3075
+ 1
3076
+ 1
3077
+ 1
3078
+ 1
3079
+ 1
3080
+ 1
3081
+ 1
3082
+ 1
3083
+ 1
3084
+ 1
3085
+ 1
3086
+ 1
3087
+ 1
3088
+ 1
3089
+ 1
3090
+ 1
3091
+ 1
3092
+ 1
3093
+ 1
3094
+ 1
3095
+ 1
3096
+ 1
3097
+ 1
3098
+ 1
3099
+ 1
3100
+ 1
3101
+ 1
3102
+ 1
3103
+ 1
3104
+ 1
3105
+ 1
3106
+ 1
3107
+ 1
3108
+ 1
3109
+ 1
3110
+ 1
3111
+ 1
3112
+ 1
3113
+ 1
3114
+ 2
3115
+ 1
3116
+ 1
3117
+ 1
3118
+ 1
3119
+ 1
3120
+ 1
3121
+ 1
3122
+ 1
3123
+ 1
3124
+ 1
3125
+ 2
3126
+ 1
3127
+ 1
3128
+ 1
3129
+ 1
3130
+ 2
3131
+ 1
3132
+ 1
3133
+ 1
3134
+ 1
3135
+ 1
3136
+ 1
3137
+ 1
3138
+ 2
3139
+ 1
3140
+ 1
3141
+ 1
3142
+ 2
3143
+ 1
3144
+ 1
3145
+ 1
3146
+ 1
3147
+ 1
3148
+ 1
3149
+ 1
3150
+ 1
3151
+ 1
3152
+ 1
3153
+ 1
3154
+ 1
3155
+ 1
3156
+ 1
3157
+ 1
3158
+ 2
3159
+ 1
3160
+ 1
3161
+ 1
3162
+ 1
3163
+ 1
3164
+ 1
3165
+ 1
3166
+ 1
3167
+ 1
3168
+ 1
3169
+ 1
3170
+ 1
3171
+ 1
3172
+ 1
3173
+ 1
3174
+ 1
3175
+ 1
3176
+ 1
3177
+ 1
3178
+ 1
3179
+ 1
3180
+ 1
3181
+ 1
3182
+ 1
3183
+ 1
3184
+ 2
3185
+ 1
3186
+ 1
3187
+ 1
3188
+ 1
3189
+ 1
3190
+ 1
3191
+ 1
3192
+ 1
3193
+ 1
3194
+ 1
3195
+ 1
3196
+ 1
3197
+ 1
3198
+ 1
3199
+ 1
3200
+ 1
3201
+ 1
3202
+ 1
3203
+ 1
3204
+ 1
3205
+ 1
3206
+ 1
3207
+ 2
3208
+ 1
3209
+ 1
3210
+ 1
3211
+ 1
3212
+ 1
3213
+ 1
3214
+ 1
3215
+ 1
3216
+ 1
3217
+ 1
3218
+ 1
3219
+ 1
3220
+ 2
3221
+ 1
3222
+ 1
3223
+ 1
3224
+ 1
3225
+ 1
3226
+ 1
3227
+ 1
3228
+ 1
3229
+ 1
3230
+ 1
3231
+ 1
3232
+ 1
3233
+ 1
3234
+ 1
3235
+ 1
3236
+ 1
3237
+ 1
3238
+ 1
3239
+ 1
3240
+ 1
3241
+ 1
3242
+ 1
3243
+ 1
3244
+ 1
3245
+ 1
3246
+ 1
3247
+ 1
3248
+ 2
3249
+ 1
3250
+ 1
3251
+ 1
3252
+ 1
3253
+ 1
3254
+ 2
3255
+ 1
3256
+ 1
3257
+ 1
3258
+ 1
3259
+ 1
3260
+ 1
3261
+ 1
3262
+ 1
3263
+ 1
3264
+ 1
3265
+ 1
3266
+ 1
3267
+ 1
3268
+ 1
3269
+ 1
3270
+ 1
3271
+ 1
3272
+ 1
3273
+ 2
3274
+ 1
3275
+ 1
3276
+ 1
3277
+ 2
3278
+ 1
3279
+ 1
3280
+ 1
3281
+ 1
3282
+ 1
3283
+ 1
3284
+ 1
3285
+ 1
3286
+ 1
3287
+ 1
3288
+ 1
3289
+ 1
3290
+ 1
3291
+ 1
3292
+ 1
3293
+ 1
3294
+ 1
3295
+ 1
3296
+ 1
3297
+ 1
3298
+ 1
3299
+ 1
3300
+ 1
3301
+ 1
3302
+ 1
3303
+ 1
3304
+ 1
3305
+ 1
3306
+ 1
3307
+ 1
3308
+ 1
3309
+ 1
3310
+ 1
3311
+ 1
3312
+ 1
3313
+ 1
3314
+ 1
3315
+ 1
3316
+ 1
3317
+ 1
3318
+ 1
3319
+ 1
3320
+ 1
3321
+ 1
3322
+ 2
3323
+ 1
3324
+ 1
3325
+ 1
3326
+ 1
3327
+ 1
3328
+ 1
3329
+ 2
3330
+ 1
3331
+ 1
3332
+ 1
3333
+ 1
3334
+ 2
3335
+ 1
3336
+ 1
3337
+ 1
3338
+ 1
3339
+ 2
3340
+ 1
3341
+ 1
3342
+ 2
3343
+ 1
3344
+ 1
3345
+ 1
3346
+ 1
3347
+ 2
3348
+ 1
3349
+ 1
3350
+ 1
3351
+ 1
3352
+ 2
3353
+ 1
3354
+ 1
3355
+ 1
3356
+ 1
3357
+ 1
3358
+ 1
3359
+ 1
3360
+ 1
3361
+ 1
3362
+ 1
3363
+ 1
3364
+ 1
3365
+ 1
3366
+ 1
3367
+ 1
3368
+ 1
3369
+ 1
3370
+ 1
3371
+ 1
3372
+ 1
3373
+ 1
3374
+ 1
3375
+ 1
3376
+ 1
3377
+ 1
3378
+ 1
3379
+ 1
3380
+ 1
3381
+ 1
3382
+ 1
3383
+ 1
3384
+ 1
3385
+ 1
3386
+ 1
3387
+ 1
3388
+ 1
3389
+ 1
3390
+ 1
3391
+ 1
3392
+ 1
3393
+ 1
3394
+ 1
3395
+ 1
3396
+ 1
3397
+ 2
3398
+ 1
3399
+ 1
3400
+ 1
3401
+ 1
3402
+ 1
3403
+ 1
3404
+ 1
3405
+ 1
3406
+ 1
3407
+ 1
3408
+ 1
3409
+ 1
3410
+ 1
3411
+ 1
3412
+ 1
3413
+ 1
3414
+ 1
3415
+ 1
3416
+ 1
3417
+ 1
3418
+ 1
3419
+ 1
3420
+ 2
3421
+ 1
3422
+ 1
3423
+ 1
3424
+ 1
3425
+ 1
3426
+ 1
3427
+ 1
3428
+ 1
3429
+ 1
3430
+ 1
3431
+ 2
3432
+ 1
3433
+ 1
3434
+ 2
3435
+ 1
3436
+ 1
3437
+ 1
3438
+ 1
3439
+ 1
3440
+ 1
3441
+ 1
3442
+ 1
3443
+ 1
3444
+ 1
3445
+ 1
3446
+ 1
3447
+ 1
3448
+ 1
3449
+ 2
3450
+ 1
3451
+ 1
3452
+ 1
3453
+ 1
3454
+ 1
3455
+ 1
3456
+ 2
3457
+ 1
3458
+ 1
3459
+ 1
3460
+ 1
3461
+ 1
3462
+ 1
3463
+ 1
3464
+ 2
3465
+ 1
3466
+ 1
3467
+ 1
3468
+ 1
3469
+ 1
3470
+ 1
3471
+ 1
3472
+ 1
3473
+ 1
3474
+ 1
3475
+ 1
3476
+ 1
3477
+ 1
3478
+ 1
3479
+ 1
3480
+ 1
3481
+ 1
3482
+ 1
3483
+ 1
3484
+ 1
3485
+ 1
3486
+ 1
3487
+ 1
3488
+ 1
3489
+ 1
3490
+ 1
3491
+ 1
3492
+ 1
3493
+ 1
3494
+ 1
3495
+ 1
3496
+ 1
3497
+ 1
3498
+ 1
3499
+ 1
3500
+ 1
3501
+ 1
3502
+ 1
3503
+ 1
3504
+ 2
3505
+ 1
3506
+ 1
3507
+ 1
3508
+ 1
3509
+ 1
3510
+ 1
3511
+ 1
3512
+ 1
3513
+ 1
3514
+ 1
3515
+ 1
3516
+ 1
3517
+ 1
3518
+ 1
3519
+ 1
3520
+ 1
3521
+ 1
3522
+ 1
3523
+ 1
3524
+ 1
3525
+ 1
3526
+ 1
3527
+ 2
3528
+ 1
3529
+ 1
3530
+ 2
3531
+ 1
3532
+ 1
3533
+ 1
3534
+ 1
3535
+ 1
3536
+ 1
3537
+ 1
3538
+ 2
3539
+ 1
3540
+ 1
3541
+ 1
3542
+ 1
3543
+ 1
3544
+ 1
3545
+ 1
3546
+ 1
3547
+ 1
3548
+ 1
3549
+ 1
3550
+ 1
3551
+ 1
3552
+ 1
3553
+ 1
3554
+ 1
3555
+ 1
3556
+ 2
3557
+ 1
3558
+ 1
3559
+ 1
3560
+ 1
3561
+ 1
3562
+ 1
3563
+ 1
3564
+ 1
3565
+ 1
3566
+ 1
3567
+ 1
3568
+ 1
3569
+ 1
3570
+ 1
3571
+ 1
3572
+ 1
3573
+ 1
3574
+ 1
3575
+ 1
3576
+ 1
3577
+ 1
3578
+ 2
3579
+ 1
3580
+ 1
3581
+ 1
3582
+ 1
3583
+ 1
3584
+ 1
3585
+ 2
3586
+ 1
3587
+ 1
3588
+ 1
3589
+ 1
3590
+ 1
3591
+ 1
3592
+ 2
3593
+ 1
3594
+ 1
3595
+ 2
3596
+ 1
3597
+ 1
3598
+ 2
3599
+ 1
3600
+ 1
3601
+ 1
3602
+ 1
3603
+ 1
3604
+ 2
3605
+ 1
3606
+ 1
3607
+ 1
3608
+ 1
3609
+ 1
3610
+ 1
3611
+ 1
3612
+ 1
3613
+ 1
3614
+ 2
3615
+ 1
3616
+ 2
3617
+ 1
3618
+ 1
3619
+ 1
3620
+ 1
3621
+ 1
3622
+ 1
3623
+ 1
3624
+ 1
3625
+ 1
3626
+ 1
3627
+ 1
3628
+ 1
3629
+ 1
3630
+ 1
3631
+ 1
3632
+ 1
3633
+ 1
3634
+ 1
3635
+ 1
3636
+ 1
3637
+ 1
3638
+ 1
3639
+ 1
3640
+ 1
3641
+ 1
3642
+ 1
3643
+ 1
3644
+ 1
3645
+ 1
3646
+ 1
3647
+ 1
3648
+ 1
3649
+ 1
3650
+ 1
3651
+ 1
3652
+ 1
3653
+ 1
3654
+ 1
3655
+ 1
3656
+ 1
3657
+ 1
3658
+ 1
3659
+ 1
3660
+ 1
3661
+ 1
3662
+ 1
3663
+ 1
3664
+ 1
3665
+ 1
3666
+ 1
3667
+ 1
3668
+ 1
3669
+ 1
3670
+ 1
3671
+ 2
3672
+ 1
3673
+ 1
3674
+ 1
3675
+ 1
3676
+ 1
3677
+ 2
3678
+ 1
3679
+ 2
3680
+ 1
3681
+ 1
3682
+ 1
3683
+ 1
3684
+ 1
3685
+ 1
3686
+ 1
3687
+ 1
3688
+ 1
3689
+ 1
3690
+ 1
3691
+ 1
3692
+ 1
3693
+ 1
3694
+ 1
3695
+ 1
3696
+ 1
3697
+ 1
3698
+ 2
3699
+ 1
3700
+ 1
3701
+ 1
3702
+ 1
3703
+ 1
3704
+ 1
3705
+ 1
3706
+ 1
3707
+ 1
3708
+ 1
3709
+ 1
3710
+ 1
3711
+ 1
3712
+ 1
3713
+ 1
3714
+ 1
3715
+ 1
3716
+ 1
3717
+ 1
3718
+ 1
3719
+ 1
3720
+ 1
3721
+ 1
3722
+ 1
3723
+ 1
3724
+ 2
3725
+ 1
3726
+ 1
3727
+ 1
3728
+ 1
3729
+ 2
3730
+ 1
3731
+ 1
3732
+ 1
3733
+ 1
3734
+ 1
3735
+ 2
3736
+ 1
3737
+ 1
3738
+ 1
3739
+ 1
3740
+ 1
3741
+ 1
3742
+ 1
3743
+ 1
3744
+ 1
3745
+ 1
3746
+ 2
3747
+ 1
3748
+ 1
3749
+ 1
3750
+ 1
3751
+ 2
3752
+ 1
3753
+ 2
3754
+ 1
3755
+ 1
3756
+ 1
3757
+ 1
3758
+ 1
3759
+ 1
3760
+ 1
3761
+ 1
3762
+ 1
3763
+ 1
3764
+ 1
3765
+ 1
3766
+ 1
3767
+ 1
3768
+ 1
3769
+ 1
3770
+ 1
3771
+ 1
3772
+ 1
3773
+ 1
3774
+ 1
3775
+ 1
3776
+ 1
3777
+ 1
3778
+ 1
3779
+ 1
3780
+ 2
3781
+ 1
3782
+ 1
3783
+ 2
3784
+ 1
3785
+ 1
3786
+ 1
3787
+ 1
3788
+ 1
3789
+ 1
3790
+ 1
3791
+ 1
3792
+ 1
3793
+ 1
3794
+ 1
3795
+ 1
3796
+ 1
3797
+ 1
3798
+ 1
3799
+ 1
3800
+ 1
3801
+ 1
3802
+ 1
3803
+ 1
3804
+ 1
3805
+ 1
3806
+ 1
3807
+ 1
3808
+ 1
3809
+ 1
3810
+ 1
3811
+ 1
3812
+ 1
3813
+ 1
3814
+ 2
3815
+ 1
3816
+ 1
3817
+ 1
3818
+ 2
3819
+ 1
3820
+ 2
3821
+ 1
3822
+ 1
3823
+ 1
3824
+ 1
3825
+ 1
3826
+ 1
3827
+ 1
3828
+ 1
3829
+ 1
3830
+ 1
3831
+ 1
3832
+ 1
3833
+ 1
3834
+ 1
3835
+ 1
3836
+ 1
3837
+ 1
3838
+ 1
3839
+ 1
3840
+ 1
3841
+ 1
3842
+ 1
3843
+ 1
3844
+ 1
3845
+ 1
3846
+ 1
3847
+ 1
3848
+ 1
3849
+ 1
3850
+ 1
3851
+ 1
3852
+ 1
3853
+ 1
3854
+ 1
3855
+ 2
3856
+ 1
3857
+ 1
3858
+ 1
3859
+ 1
3860
+ 1
3861
+ 1
3862
+ 1
3863
+ 1
3864
+ 1
3865
+ 1
3866
+ 1
3867
+ 1
3868
+ 1
3869
+ 1
3870
+ 1
3871
+ 1
3872
+ 1
3873
+ 1
3874
+ 1
3875
+ 1
3876
+ 1
3877
+ 1
3878
+ 1
3879
+ 1
3880
+ 1
3881
+ 1
3882
+ 1
3883
+ 1
3884
+ 1
3885
+ 1
3886
+ 2
3887
+ 1
3888
+ 1
3889
+ 1
3890
+ 1
3891
+ 1
3892
+ 1
3893
+ 1
3894
+ 1
3895
+ 1
3896
+ 1
3897
+ 1
3898
+ 1
3899
+ 1
3900
+ 1
3901
+ 1
3902
+ 1
3903
+ 1
3904
+ 1
3905
+ 1
3906
+ 1
3907
+ 1
3908
+ 1
3909
+ 1
3910
+ 1
3911
+ 1
3912
+ 1
3913
+ 1
3914
+ 1
3915
+ 1
3916
+ 1
3917
+ 1
3918
+ 1
3919
+ 1
3920
+ 1
3921
+ 1
3922
+ 1
3923
+ 1
3924
+ 1
3925
+ 1
3926
+ 1
3927
+ 1
3928
+ 1
3929
+ 1
3930
+ 1
3931
+ 1
3932
+ 1
3933
+ 1
3934
+ 1
3935
+ 1
3936
+ 1
3937
+ 1
3938
+ 1
3939
+ 1
3940
+ 1
3941
+ 1
3942
+ 1
3943
+ 1
3944
+ 1
3945
+ 2
3946
+ 1
3947
+ 1
3948
+ 2
3949
+ 1
3950
+ 1
3951
+ 1
3952
+ 1
3953
+ 1
3954
+ 1
3955
+ 1
3956
+ 1
3957
+ 1
3958
+ 1
3959
+ 1
3960
+ 1
3961
+ 1
3962
+ 1
3963
+ 1
3964
+ 1
3965
+ 1
3966
+ 1
3967
+ 1
3968
+ 1
3969
+ 1
3970
+ 1
3971
+ 2
3972
+ 1
3973
+ 1
3974
+ 1
3975
+ 1
3976
+ 1
3977
+ 1
3978
+ 1
3979
+ 1
3980
+ 1
3981
+ 1
3982
+ 1
3983
+ 1
3984
+ 1
3985
+ 1
3986
+ 2
3987
+ 1
3988
+ 1
3989
+ 1
3990
+ 1
3991
+ 1
3992
+ 1
3993
+ 1
3994
+ 1
3995
+ 1
3996
+ 1
3997
+ 1
3998
+ 1
3999
+ 1
4000
+ 1
4001
+ 1
4002
+ 1
4003
+ 1
4004
+ 1
4005
+ 1
4006
+ 1
4007
+ 1
4008
+ 1
4009
+ 1
4010
+ 1
4011
+ 1
4012
+ 2
4013
+ 1
4014
+ 1
4015
+ 1
4016
+ 1
4017
+ 1
4018
+ 1
4019
+ 1
4020
+ 1
4021
+ 1
4022
+ 1
4023
+ 2
4024
+ 1
4025
+ 1
4026
+ 1
4027
+ 1
4028
+ 1
4029
+ 1
4030
+ 1
4031
+ 1
4032
+ 1
4033
+ 1
4034
+ 1
4035
+ 1
4036
+ 1
4037
+ 1
4038
+ 1
4039
+ 1
4040
+ 1
4041
+ 1
4042
+ 1
4043
+ 1
4044
+ 1
4045
+ 1
4046
+ 1
4047
+ 1
4048
+ 1
4049
+ 1
4050
+ 1
4051
+ 1
4052
+ 1
4053
+ 1
4054
+ 1
4055
+ 1
4056
+ 1
4057
+ 1
4058
+ 1
4059
+ 1
4060
+ 1
4061
+ 1
4062
+ 1
4063
+ 1
4064
+ 1
4065
+ 1
4066
+ 1
4067
+ 1
4068
+ 1
4069
+ 1
4070
+ 1
4071
+ 1
4072
+ 2
4073
+ 1
4074
+ 1
4075
+ 1
4076
+ 2
4077
+ 1
4078
+ 1
4079
+ 1
4080
+ 1
4081
+ 1
4082
+ 1
4083
+ 1
4084
+ 1
4085
+ 1
4086
+ 1
4087
+ 1
4088
+ 1
4089
+ 1
4090
+ 1
4091
+ 1
4092
+ 1
4093
+ 1
4094
+ 1
4095
+ 1
4096
+ 1
4097
+ 1
4098
+ 1
4099
+ 1
4100
+ 1
4101
+ 1
4102
+ 1
4103
+ 1
4104
+ 1
4105
+ 1
4106
+ 1
4107
+ 1
4108
+ 1
4109
+ 1
4110
+ 1
4111
+ 1
4112
+ 1
4113
+ 1
4114
+ 1
4115
+ 1
4116
+ 1
4117
+ 1
4118
+ 1
4119
+ 1
4120
+ 1
4121
+ 1
4122
+ 1
4123
+ 1
4124
+ 1
4125
+ 1
4126
+ 1
4127
+ 1
4128
+ 1
4129
+ 1
4130
+ 1
4131
+ 1
4132
+ 1
4133
+ 2
4134
+ 1
4135
+ 1
4136
+ 1
4137
+ 1
4138
+ 1
4139
+ 1
4140
+ 1
4141
+ 1
4142
+ 1
4143
+ 1
4144
+ 1
4145
+ 1
4146
+ 1
4147
+ 1
4148
+ 1
4149
+ 1
4150
+ 1
4151
+ 1
4152
+ 1
4153
+ 1
4154
+ 1
4155
+ 1
4156
+ 1
4157
+ 1
4158
+ 1
4159
+ 2
4160
+ 1
4161
+ 1
4162
+ 1
4163
+ 1
4164
+ 1
4165
+ 1
4166
+ 1
4167
+ 1
4168
+ 2
4169
+ 1
4170
+ 1
4171
+ 1
4172
+ 1
4173
+ 1
4174
+ 1
4175
+ 1
4176
+ 1
4177
+ 1
4178
+ 1
4179
+ 1
4180
+ 1
4181
+ 1
4182
+ 1
4183
+ 1
4184
+ 1
4185
+ 1
4186
+ 1
4187
+ 1
4188
+ 1
4189
+ 1
4190
+ 1
4191
+ 2
4192
+ 1
4193
+ 1
4194
+ 1
4195
+ 2
4196
+ 1
4197
+ 1
4198
+ 1
4199
+ 1
4200
+ 1
4201
+ 1
4202
+ 1
4203
+ 1
4204
+ 1
4205
+ 1
4206
+ 1
4207
+ 1
4208
+ 2
4209
+ 1
4210
+ 1
4211
+ 1
4212
+ 1
4213
+ 1
4214
+ 1
4215
+ 1
4216
+ 1
4217
+ 1
4218
+ 1
4219
+ 1
4220
+ 1
4221
+ 1
4222
+ 1
4223
+ 1
4224
+ 1
4225
+ 1
4226
+ 1
4227
+ 1
4228
+ 1
4229
+ 1
4230
+ 1
4231
+ 1
4232
+ 1
4233
+ 1
4234
+ 1
4235
+ 1
4236
+ 1
4237
+ 1
4238
+ 1
4239
+ 1
4240
+ 1
4241
+ 1
4242
+ 1
4243
+ 1
4244
+ 1
4245
+ 1
4246
+ 1
4247
+ 2
4248
+ 1
4249
+ 1
4250
+ 2
4251
+ 1
4252
+ 1
4253
+ 1
4254
+ 1
4255
+ 1
4256
+ 1
4257
+ 1
4258
+ 1
4259
+ 1
4260
+ 1
4261
+ 1
4262
+ 1
4263
+ 1
4264
+ 1
4265
+ 1
4266
+ 1
4267
+ 1
4268
+ 1
4269
+ 1
4270
+ 1
4271
+ 1
4272
+ 1
4273
+ 1
4274
+ 1
4275
+ 1
4276
+ 1
4277
+ 1
4278
+ 1
4279
+ 1
4280
+ 1
4281
+ 1
4282
+ 1
4283
+ 1
4284
+ 1
4285
+ 1
4286
+ 1
4287
+ 1
4288
+ 1
4289
+ 1
4290
+ 1
4291
+ 1
4292
+ 1
4293
+ 1
4294
+ 1
4295
+ 1
4296
+ 1
4297
+ 1
4298
+ 1
4299
+ 2
4300
+ 1
4301
+ 1
4302
+ 1
4303
+ 1
4304
+ 1
4305
+ 1
4306
+ 1
4307
+ 1
4308
+ 2
4309
+ 1
4310
+ 1
4311
+ 1
4312
+ 1
4313
+ 1
4314
+ 1
4315
+ 1
4316
+ 1
4317
+ 1
4318
+ 2
4319
+ 2
4320
+ 2
4321
+ 2
4322
+ 1
4323
+ 1
4324
+ 1
4325
+ 1
4326
+ 1
4327
+ 1
4328
+ 1
4329
+ 1
4330
+ 1
4331
+ 1
4332
+ 1
4333
+ 1
4334
+ 1
4335
+ 1
4336
+ 1
4337
+ 1
4338
+ 1
4339
+ 1
4340
+ 1
4341
+ 1
4342
+ 1
4343
+ 1
4344
+ 1
4345
+ 1
4346
+ 1
4347
+ 1
4348
+ 1
4349
+ 1
4350
+ 1
4351
+ 1
4352
+ 1
4353
+ 1
4354
+ 1
4355
+ 1
4356
+ 1
4357
+ 1
4358
+ 1
4359
+ 1
4360
+ 1
4361
+ 1
4362
+ 1
4363
+ 1
4364
+ 1
4365
+ 1
4366
+ 1
4367
+ 1
4368
+ 1
4369
+ 1
4370
+ 1
4371
+ 1
4372
+ 1
4373
+ 1
4374
+ 1
4375
+ 1
4376
+ 1
4377
+ 1
4378
+ 1
4379
+ 1
4380
+ 1
4381
+ 1
4382
+ 1
4383
+ 2
4384
+ 1
4385
+ 1
4386
+ 1
4387
+ 1
4388
+ 1
4389
+ 1
4390
+ 1
4391
+ 1
4392
+ 1
4393
+ 1
4394
+ 1
4395
+ 1
4396
+ 1
4397
+ 1
4398
+ 1
4399
+ 1
4400
+ 2
4401
+ 1
4402
+ 2
4403
+ 1
4404
+ 1
4405
+ 1
4406
+ 1
4407
+ 1
4408
+ 2
4409
+ 1
4410
+ 1
4411
+ 1
4412
+ 1
4413
+ 1
4414
+ 1
4415
+ 1
4416
+ 1
4417
+ 2
4418
+ 1
4419
+ 1
4420
+ 1
4421
+ 1
4422
+ 1
4423
+ 1
4424
+ 2
4425
+ 1
4426
+ 1
4427
+ 1
4428
+ 1
4429
+ 1
4430
+ 1
4431
+ 1
4432
+ 1
4433
+ 1
4434
+ 1
4435
+ 1
4436
+ 1
4437
+ 1
4438
+ 1
4439
+ 1
4440
+ 1
4441
+ 1
4442
+ 1
4443
+ 1
4444
+ 1
4445
+ 1
4446
+ 1
4447
+ 1
4448
+ 1
4449
+ 1
4450
+ 1
4451
+ 1
4452
+ 1
4453
+ 1
4454
+ 1
4455
+ 1
4456
+ 1
4457
+ 1
4458
+ 1
4459
+ 1
4460
+ 1
4461
+ 1
4462
+ 1
4463
+ 1
4464
+ 1
4465
+ 1
4466
+ 1
4467
+ 1
4468
+ 1
4469
+ 1
4470
+ 1
4471
+ 1
4472
+ 1
4473
+ 1
4474
+ 1
4475
+ 1
4476
+ 1
4477
+ 1
4478
+ 1
4479
+ 1
4480
+ 1
4481
+ 1
4482
+ 1
4483
+ 1
4484
+ 1
4485
+ 2
4486
+ 1
4487
+ 1
4488
+ 1
4489
+ 1
4490
+ 1
4491
+ 1
4492
+ 2
4493
+ 1
4494
+ 2
4495
+ 1
4496
+ 1
4497
+ 1
4498
+ 1
4499
+ 1
4500
+ 1
4501
+ 1
4502
+ 1
4503
+ 1
4504
+ 1
4505
+ 1
4506
+ 1
4507
+ 1
4508
+ 1
4509
+ 1
4510
+ 1
4511
+ 1
4512
+ 1
4513
+ 1
4514
+ 1
4515
+ 1
4516
+ 1
4517
+ 1
4518
+ 2
4519
+ 1
4520
+ 1
4521
+ 1
4522
+ 1
4523
+ 1
4524
+ 1
4525
+ 1
4526
+ 2
4527
+ 1
4528
+ 1
4529
+ 1
4530
+ 1
4531
+ 1
4532
+ 1
4533
+ 1
4534
+ 1
4535
+ 1
4536
+ 1
4537
+ 1
4538
+ 1
4539
+ 2
4540
+ 1
4541
+ 1
4542
+ 1
4543
+ 1
4544
+ 1
4545
+ 1
4546
+ 1
4547
+ 1
4548
+ 1
4549
+ 1
4550
+ 1
4551
+ 1
4552
+ 1
4553
+ 1
4554
+ 1
4555
+ 1
4556
+ 1
4557
+ 1
4558
+ 1
4559
+ 1
4560
+ 1
4561
+ 1
4562
+ 1
4563
+ 1
4564
+ 1
4565
+ 1
4566
+ 1
4567
+ 1
4568
+ 1
4569
+ 1
4570
+ 1
4571
+ 1
4572
+ 1
4573
+ 1
4574
+ 1
4575
+ 1
4576
+ 1
4577
+ 1
4578
+ 1
4579
+ 2
4580
+ 1
4581
+ 1
4582
+ 1
4583
+ 1
4584
+ 1
4585
+ 1
4586
+ 1
4587
+ 1
4588
+ 1
4589
+ 1
4590
+ 1
4591
+ 1
4592
+ 1
4593
+ 1
4594
+ 1
4595
+ 1
4596
+ 1
4597
+ 1
4598
+ 1
4599
+ 1
4600
+ 1
4601
+ 1
4602
+ 1
4603
+ 1
4604
+ 1
4605
+ 1
4606
+ 1
4607
+ 2
4608
+ 1
4609
+ 1
4610
+ 2
4611
+ 1
4612
+ 1
4613
+ 1
4614
+ 1
4615
+ 1
4616
+ 1
4617
+ 1
4618
+ 1
4619
+ 1
4620
+ 1
4621
+ 2
4622
+ 1
4623
+ 1
4624
+ 2
4625
+ 1
4626
+ 1
4627
+ 1
4628
+ 1
4629
+ 1
4630
+ 1
4631
+ 1
4632
+ 1
4633
+ 1
4634
+ 1
4635
+ 1
4636
+ 1
4637
+ 1
4638
+ 2
4639
+ 1
4640
+ 1
4641
+ 1
4642
+ 1
4643
+ 1
4644
+ 1
4645
+ 1
4646
+ 1
4647
+ 2
4648
+ 1
4649
+ 1
4650
+ 1
4651
+ 1
4652
+ 1
4653
+ 1
4654
+ 1
4655
+ 1
4656
+ 1
4657
+ 1
4658
+ 1
4659
+ 1
4660
+ 1
4661
+ 1
4662
+ 1
4663
+ 2
4664
+ 1
4665
+ 1
4666
+ 1
4667
+ 1
4668
+ 1
4669
+ 2
4670
+ 1
4671
+ 1
4672
+ 1
4673
+ 1
4674
+ 1
4675
+ 1
4676
+ 1
4677
+ 1
4678
+ 1
4679
+ 1
4680
+ 1
4681
+ 1
4682
+ 1
4683
+ 1
4684
+ 1
4685
+ 1
4686
+ 1
4687
+ 1
4688
+ 1
4689
+ 1
4690
+ 1
4691
+ 1
4692
+ 1
4693
+ 1
4694
+ 1
4695
+ 1
4696
+ 1
4697
+ 1
4698
+ 1
4699
+ 1
4700
+ 1
4701
+ 1
4702
+ 1
4703
+ 1
4704
+ 1
4705
+ 1
4706
+ 1
4707
+ 1
4708
+ 1
4709
+ 1
4710
+ 1
4711
+ 1
4712
+ 1
4713
+ 1
4714
+ 1
4715
+ 1
4716
+ 1
4717
+ 2
4718
+ 1
4719
+ 1
4720
+ 1
4721
+ 1
4722
+ 1
4723
+ 1
4724
+ 1
4725
+ 1
4726
+ 1
4727
+ 1
4728
+ 1
4729
+ 1
4730
+ 1
4731
+ 1
4732
+ 1
4733
+ 1
4734
+ 1
4735
+ 1
4736
+ 1
4737
+ 1
4738
+ 1
4739
+ 1
4740
+ 2
4741
+ 1
4742
+ 1
4743
+ 1
4744
+ 1
4745
+ 1
4746
+ 1
4747
+ 1
4748
+ 2
4749
+ 1
4750
+ 1
4751
+ 1
4752
+ 1
4753
+ 1
4754
+ 1
4755
+ 1
4756
+ 1
4757
+ 1
4758
+ 1
4759
+ 1
4760
+ 1
4761
+ 1
4762
+ 1
4763
+ 1
4764
+ 1
4765
+ 1
4766
+ 1
4767
+ 1
4768
+ 1
4769
+ 1
4770
+ 1
4771
+ 2
4772
+ 1
4773
+ 1
4774
+ 1
4775
+ 2
4776
+ 1
4777
+ 2
4778
+ 1
4779
+ 1
4780
+ 1
4781
+ 1
4782
+ 1
4783
+ 1
4784
+ 1
4785
+ 1
4786
+ 2
4787
+ 1
4788
+ 1
4789
+ 1
4790
+ 1
4791
+ 1
4792
+ 1
4793
+ 1
4794
+ 1
4795
+ 1
4796
+ 1
4797
+ 1
4798
+ 1
4799
+ 1
4800
+ 1
4801
+ 2
4802
+ 1
4803
+ 1
4804
+ 1
4805
+ 1
4806
+ 1
4807
+ 1
4808
+ 1
4809
+ 1
4810
+ 1
4811
+ 1
4812
+ 1
4813
+ 1
4814
+ 1
4815
+ 1
4816
+ 1
4817
+ 1
4818
+ 1
4819
+ 1
4820
+ 1
4821
+ 1
4822
+ 1
4823
+ 1
4824
+ 1
4825
+ 1
4826
+ 1
4827
+ 1
4828
+ 1
4829
+ 1
4830
+ 1
4831
+ 1
4832
+ 1
4833
+ 1
4834
+ 1
4835
+ 1
4836
+ 1
4837
+ 1
4838
+ 1
4839
+ 1
4840
+ 1
4841
+ 1
4842
+ 1
4843
+ 1
4844
+ 1
4845
+ 1
4846
+ 2
4847
+ 1
4848
+ 1
4849
+ 1
4850
+ 1
4851
+ 1
4852
+ 1
4853
+ 1
4854
+ 1
4855
+ 1
4856
+ 1
4857
+ 1
4858
+ 1
4859
+ 1
4860
+ 1
4861
+ 1
4862
+ 1
4863
+ 1
4864
+ 2
4865
+ 1
4866
+ 1
4867
+ 1
4868
+ 1
4869
+ 1
4870
+ 1
4871
+ 1
4872
+ 1
4873
+ 1
4874
+ 1
4875
+ 1
4876
+ 1
4877
+ 1
4878
+ 1
4879
+ 1
4880
+ 1
4881
+ 1
4882
+ 1
4883
+ 1
4884
+ 1
4885
+ 1
4886
+ 1
4887
+ 1
4888
+ 1
4889
+ 1
4890
+ 1
4891
+ 1
4892
+ 2
4893
+ 1
4894
+ 1
4895
+ 1
4896
+ 1
4897
+ 1
4898
+ 1
4899
+ 1
4900
+ 1
4901
+ 1
4902
+ 1
4903
+ 1
4904
+ 1
4905
+ 2
4906
+ 1
4907
+ 1
4908
+ 1
4909
+ 1
4910
+ 1
4911
+ 1
4912
+ 1
4913
+ 1
4914
+ 1
4915
+ 1
4916
+ 1
4917
+ 1
4918
+ 1
4919
+ 1
4920
+ 1
4921
+ 1
4922
+ 1
4923
+ 2
4924
+ 1
4925
+ 1
4926
+ 2
4927
+ 1
4928
+ 1
4929
+ 1
4930
+ 1
4931
+ 1
4932
+ 1
4933
+ 1
4934
+ 1
4935
+ 1
4936
+ 1
4937
+ 1
4938
+ 1
4939
+ 1
4940
+ 1
4941
+ 1
4942
+ 1
4943
+ 1
4944
+ 1
4945
+ 1
4946
+ 1
4947
+ 1
4948
+ 1
4949
+ 1
4950
+ 1
4951
+ 1
4952
+ 1
4953
+ 1
4954
+ 1
4955
+ 1
4956
+ 1
4957
+ 2
4958
+ 1
4959
+ 1
4960
+ 1
4961
+ 1
4962
+ 1
4963
+ 1
4964
+ 2
4965
+ 2
4966
+ 1
4967
+ 1
4968
+ 1
4969
+ 1
4970
+ 1
4971
+ 1
4972
+ 1
4973
+ 1
4974
+ 1
4975
+ 1
4976
+ 1
4977
+ 1
4978
+ 1
4979
+ 1
4980
+ 1
4981
+ 1
4982
+ 1
4983
+ 1
4984
+ 1
4985
+ 1
4986
+ 1
4987
+ 1
4988
+ 1
4989
+ 1
4990
+ 1
4991
+ 1
4992
+ 1
4993
+ 1
4994
+ 1
4995
+ 2
4996
+ 1
4997
+ 1
4998
+ 1
4999
+ 1
5000
+ 1
5001
+ 1
5002
+ 1
5003
+ 1
5004
+ 1
5005
+ 1
5006
+ 1
5007
+ 1
5008
+ 1
5009
+ 1
5010
+ 1
5011
+ 1
5012
+ 2
5013
+ 1
5014
+ 1
5015
+ 1
5016
+ 1
5017
+ 1
5018
+ 1
5019
+ 1
5020
+ 2
5021
+ 1
5022
+ 1
5023
+ 1
5024
+ 1
5025
+ 1
5026
+ 1
5027
+ 1
5028
+ 1
5029
+ 1
5030
+ 1
5031
+ 1
5032
+ 1
5033
+ 1
5034
+ 1
5035
+ 1
5036
+ 1
5037
+ 2
5038
+ 1
5039
+ 2
5040
+ 1
5041
+ 1
5042
+ 2
5043
+ 1
5044
+ 1
5045
+ 1
5046
+ 1
5047
+ 1
5048
+ 1
5049
+ 1
5050
+ 1
5051
+ 1
5052
+ 1
5053
+ 1
5054
+ 1
5055
+ 1
5056
+ 2
5057
+ 1
5058
+ 1
5059
+ 1
5060
+ 1
5061
+ 1
5062
+ 1
5063
+ 1
5064
+ 1
5065
+ 1
5066
+ 1
5067
+ 1
5068
+ 1
5069
+ 1
5070
+ 1
5071
+ 1
5072
+ 1
5073
+ 1
5074
+ 1
5075
+ 1
5076
+ 1
5077
+ 1
5078
+ 1
5079
+ 1
5080
+ 1
5081
+ 1
5082
+ 1
5083
+ 1
5084
+ 1
5085
+ 1
5086
+ 1
5087
+ 1
5088
+ 1
5089
+ 1
5090
+ 1
5091
+ 1
5092
+ 1
5093
+ 1
5094
+ 1
5095
+ 1
5096
+ 1
5097
+ 1
5098
+ 1
5099
+ 1
5100
+ 1
5101
+ 1
5102
+ 1
5103
+ 1
5104
+ 1
5105
+ 1
5106
+ 1
5107
+ 1
5108
+ 1
5109
+ 1
5110
+ 1
5111
+ 1
5112
+ 1
5113
+ 1
5114
+ 1
5115
+ 1
5116
+ 1
5117
+ 1
5118
+ 1
5119
+ 2
5120
+ 1
5121
+ 1
5122
+ 1
5123
+ 2
5124
+ 1
5125
+ 1
5126
+ 1
5127
+ 1
5128
+ 1
5129
+ 1
5130
+ 1
5131
+ 2
5132
+ 1
5133
+ 1
5134
+ 1
5135
+ 1
5136
+ 1
5137
+ 1
5138
+ 1
5139
+ 1
5140
+ 1
5141
+ 1
5142
+ 1
5143
+ 1
5144
+ 1
5145
+ 1
5146
+ 1
5147
+ 1
5148
+ 1
5149
+ 1
5150
+ 1
5151
+ 1
5152
+ 1
5153
+ 1
5154
+ 1
5155
+ 1
5156
+ 1
5157
+ 1
5158
+ 1
5159
+ 1
5160
+ 1
5161
+ 1
5162
+ 1
5163
+ 2
5164
+ 1
5165
+ 2
5166
+ 1
5167
+ 1
5168
+ 1
5169
+ 1
5170
+ 1
5171
+ 1
5172
+ 1
5173
+ 1
5174
+ 1
5175
+ 1
5176
+ 1
5177
+ 1
5178
+ 1
5179
+ 2
5180
+ 1
5181
+ 1
5182
+ 1
5183
+ 1
5184
+ 1
5185
+ 1
5186
+ 1
5187
+ 1
5188
+ 1
5189
+ 1
5190
+ 1
5191
+ 1
5192
+ 1
5193
+ 1
5194
+ 1
5195
+ 1
5196
+ 1
5197
+ 2
5198
+ 1
5199
+ 1
5200
+ 1
5201
+ 1
5202
+ 1
5203
+ 1
5204
+ 1
5205
+ 1
5206
+ 1
5207
+ 1
5208
+ 1
5209
+ 1
5210
+ 1
5211
+ 1
5212
+ 1
5213
+ 1
5214
+ 1
5215
+ 1
5216
+ 1
5217
+ 1
5218
+ 1
5219
+ 1
5220
+ 1
5221
+ 1
5222
+ 1
5223
+ 1
5224
+ 1
5225
+ 1
5226
+ 1
5227
+ 1
5228
+ 2
5229
+ 1
5230
+ 1
5231
+ 1
5232
+ 1
5233
+ 1
5234
+ 1
5235
+ 1
5236
+ 1
5237
+ 1
5238
+ 1
5239
+ 1
5240
+ 1
5241
+ 1
5242
+ 1
5243
+ 1
5244
+ 1
5245
+ 1
5246
+ 1
5247
+ 1
5248
+ 1
5249
+ 1
5250
+ 1
5251
+ 1
5252
+ 1
5253
+ 1
5254
+ 1
5255
+ 1
5256
+ 1
5257
+ 1
5258
+ 1
5259
+ 1
5260
+ 1
5261
+ 1
5262
+ 1
5263
+ 1
5264
+ 1
5265
+ 1
5266
+ 1
5267
+ 2
5268
+ 1
5269
+ 1
5270
+ 1
5271
+ 2
5272
+ 1
5273
+ 1
5274
+ 2
5275
+ 1
5276
+ 1
5277
+ 1
5278
+ 1
5279
+ 1
5280
+ 2
5281
+ 1
5282
+ 1
5283
+ 1
5284
+ 1
5285
+ 1
5286
+ 1
5287
+ 1
5288
+ 1
5289
+ 1
5290
+ 1
5291
+ 1
5292
+ 1
5293
+ 1
5294
+ 1
5295
+ 1
5296
+ 1
5297
+ 1
5298
+ 1
5299
+ 1
5300
+ 2
5301
+ 1
5302
+ 1
5303
+ 1
5304
+ 1
5305
+ 1
5306
+ 1
5307
+ 1
5308
+ 1
5309
+ 1
5310
+ 1
5311
+ 2
5312
+ 1
5313
+ 1
5314
+ 1
5315
+ 2
5316
+ 1
5317
+ 1
5318
+ 1
5319
+ 1
5320
+ 1
5321
+ 1
5322
+ 1
5323
+ 1
5324
+ 1
5325
+ 1
5326
+ 1
5327
+ 1
5328
+ 1
5329
+ 1
5330
+ 1
5331
+ 1
5332
+ 1
5333
+ 1
5334
+ 1
5335
+ 1
5336
+ 1
5337
+ 1
5338
+ 1
5339
+ 1
5340
+ 1
5341
+ 1
5342
+ 1
5343
+ 1
5344
+ 1
5345
+ 1
5346
+ 1
5347
+ 1
5348
+ 1
5349
+ 1
5350
+ 1
5351
+ 1
5352
+ 1
5353
+ 1
5354
+ 1
5355
+ 1
5356
+ 1
5357
+ 1
5358
+ 1
5359
+ 1
5360
+ 1
5361
+ 1
5362
+ 1
5363
+ 1
5364
+ 2
5365
+ 1
5366
+ 1
5367
+ 1
5368
+ 1
5369
+ 1
5370
+ 1
5371
+ 1
5372
+ 1
5373
+ 1
5374
+ 1
5375
+ 1
5376
+ 2
5377
+ 1
5378
+ 1
5379
+ 1
5380
+ 1
5381
+ 1
5382
+ 1
5383
+ 1
5384
+ 1
5385
+ 2
5386
+ 1
5387
+ 1
5388
+ 1
5389
+ 1
5390
+ 1
5391
+ 1
5392
+ 1
5393
+ 1
5394
+ 2
5395
+ 1
5396
+ 1
5397
+ 1
5398
+ 1
5399
+ 1
5400
+ 1
5401
+ 1
5402
+ 1
5403
+ 1
5404
+ 1
5405
+ 1
5406
+ 1
5407
+ 1
5408
+ 1
5409
+ 1
5410
+ 1
5411
+ 1
5412
+ 1
5413
+ 1
5414
+ 1
5415
+ 2
5416
+ 1
5417
+ 1
5418
+ 2
5419
+ 1
5420
+ 1
5421
+ 1
5422
+ 1
5423
+ 1
5424
+ 1
5425
+ 1
5426
+ 1
5427
+ 1
5428
+ 1
5429
+ 1
5430
+ 1
5431
+ 1
5432
+ 1
5433
+ 1
5434
+ 2
5435
+ 1
5436
+ 1
5437
+ 1
5438
+ 1
5439
+ 1
5440
+ 1
5441
+ 1
5442
+ 1
5443
+ 1
5444
+ 1
5445
+ 1
5446
+ 1
5447
+ 1
5448
+ 1
5449
+ 2
5450
+ 1
5451
+ 1
5452
+ 1
5453
+ 1
5454
+ 1
5455
+ 1
5456
+ 1
5457
+ 1
5458
+ 1
5459
+ 1
5460
+ 1
5461
+ 1
5462
+ 1
5463
+ 1
5464
+ 1
5465
+ 1
5466
+ 1
5467
+ 1
5468
+ 1
5469
+ 1
5470
+ 1
5471
+ 1
5472
+ 1
5473
+ 1
5474
+ 1
5475
+ 1
5476
+ 1
5477
+ 1
5478
+ 1
5479
+ 1
5480
+ 1
5481
+ 1
5482
+ 1
5483
+ 1
5484
+ 1
5485
+ 1
5486
+ 1
5487
+ 1
5488
+ 1
5489
+ 1
5490
+ 1
5491
+ 1
5492
+ 1
5493
+ 1
5494
+ 1
5495
+ 2
5496
+ 1
5497
+ 1
5498
+ 1
5499
+ 1
5500
+ 1
5501
+ 1
5502
+ 1
5503
+ 1
5504
+ 1
5505
+ 1
5506
+ 2
5507
+ 1
5508
+ 1
5509
+ 1
5510
+ 2
5511
+ 1
5512
+ 1
5513
+ 1
5514
+ 1
5515
+ 1
5516
+ 1
5517
+ 1
5518
+ 1
5519
+ 1
5520
+ 1
5521
+ 1
5522
+ 1
5523
+ 1
5524
+ 1
5525
+ 1
5526
+ 2
5527
+ 1
5528
+ 1
5529
+ 1
5530
+ 1
5531
+ 1
5532
+ 1
5533
+ 1
5534
+ 1
5535
+ 1
5536
+ 1
5537
+ 1
5538
+ 1
5539
+ 1
5540
+ 1
5541
+ 1
5542
+ 1
5543
+ 1
5544
+ 1
5545
+ 1
5546
+ 1
5547
+ 1
5548
+ 1
5549
+ 1
5550
+ 1
5551
+ 1
5552
+ 1
5553
+ 1
5554
+ 1
5555
+ 1
5556
+ 1
5557
+ 1
5558
+ 1
5559
+ 1
5560
+ 1
5561
+ 1
5562
+ 1
5563
+ 1
5564
+ 1
5565
+ 1
5566
+ 1
5567
+ 2
5568
+ 1
5569
+ 1
5570
+ 1
5571
+ 1
5572
+ 1
5573
+ 1
5574
+ 1
5575
+ 1
5576
+ 1
5577
+ 1
5578
+ 1
5579
+ 1
5580
+ 1
5581
+ 1
5582
+ 2
5583
+ 1
5584
+ 1
5585
+ 1
5586
+ 1
5587
+ 1
5588
+ 1
5589
+ 1
5590
+ 1
5591
+ 1
5592
+ 1
5593
+ 1
5594
+ 1
5595
+ 1
5596
+ 1
5597
+ 1
5598
+ 1
5599
+ 1
5600
+ 1
5601
+ 1
5602
+ 1
5603
+ 2
5604
+ 1
5605
+ 1
5606
+ 1
5607
+ 1
5608
+ 1
5609
+ 1
5610
+ 2
5611
+ 1
5612
+ 1
5613
+ 1
5614
+ 1
5615
+ 1
5616
+ 1
5617
+ 1
5618
+ 1
5619
+ 1
5620
+ 1
5621
+ 2
5622
+ 1
5623
+ 1
5624
+ 1
5625
+ 1
5626
+ 1
5627
+ 1
5628
+ 1
5629
+ 1
5630
+ 1
5631
+ 1
5632
+ 1
5633
+ 1
5634
+ 1
5635
+ 1
5636
+ 1
5637
+ 1
5638
+ 1
5639
+ 1
5640
+ 1
5641
+ 1
5642
+ 1
5643
+ 1
5644
+ 1
5645
+ 1
5646
+ 1
5647
+ 1
5648
+ 1
5649
+ 1
5650
+ 1
5651
+ 1
5652
+ 1
5653
+ 1
5654
+ 2
5655
+ 1
5656
+ 1
5657
+ 1
5658
+ 1
5659
+ 1
5660
+ 1
5661
+ 1
5662
+ 1
5663
+ 1
5664
+ 1
5665
+ 1
5666
+ 1
5667
+ 1
5668
+ 1
5669
+ 1
5670
+ 1
5671
+ 2
5672
+ 1
5673
+ 1
5674
+ 1
5675
+ 1
5676
+ 1
5677
+ 1
5678
+ 1
5679
+ 2
5680
+ 1
5681
+ 1
5682
+ 1
5683
+ 1
5684
+ 1
5685
+ 1
5686
+ 1
5687
+ 1
5688
+ 1
5689
+ 1
5690
+ 1
5691
+ 2
5692
+ 1
5693
+ 1
5694
+ 1
5695
+ 1
5696
+ 1
5697
+ 1
5698
+ 1
5699
+ 1
5700
+ 1
5701
+ 2
5702
+ 1
5703
+ 1
5704
+ 2
5705
+ 1
5706
+ 1
5707
+ 1
5708
+ 1
5709
+ 1
5710
+ 1
5711
+ 1
5712
+ 1
5713
+ 1
5714
+ 1
5715
+ 1
5716
+ 1
5717
+ 1
5718
+ 1
5719
+ 1
5720
+ 1
5721
+ 1
5722
+ 1
5723
+ 1
5724
+ 1
5725
+ 2
5726
+ 1
5727
+ 1
5728
+ 1
5729
+ 1
5730
+ 1
5731
+ 1
5732
+ 1
5733
+ 1
5734
+ 1
5735
+ 1
5736
+ 1
5737
+ 1
5738
+ 1
5739
+ 1
5740
+ 1
5741
+ 1
5742
+ 1
5743
+ 1
5744
+ 1
5745
+ 1
5746
+ 1
5747
+ 1
5748
+ 1
5749
+ 1
5750
+ 1
5751
+ 1
5752
+ 1
5753
+ 2
5754
+ 1
5755
+ 1
5756
+ 1
5757
+ 1
5758
+ 1
5759
+ 1
5760
+ 1
5761
+ 1
5762
+ 1
5763
+ 1
5764
+ 1
5765
+ 1
5766
+ 2
5767
+ 1
5768
+ 1
5769
+ 1
5770
+ 1
5771
+ 1
5772
+ 1
5773
+ 1
5774
+ 1
5775
+ 1
5776
+ 1
5777
+ 1
5778
+ 1
5779
+ 1
5780
+ 1
5781
+ 1
5782
+ 1
5783
+ 1
5784
+ 1
5785
+ 1
5786
+ 1
5787
+ 1
5788
+ 1
5789
+ 1
5790
+ 1
5791
+ 1
5792
+ 1
5793
+ 1
5794
+ 1
5795
+ 1
5796
+ 1
5797
+ 1
5798
+ 1
5799
+ 1
5800
+ 1
5801
+ 1
5802
+ 1
5803
+ 1
5804
+ 2
5805
+ 1
5806
+ 1
5807
+ 1
5808
+ 1
5809
+ 1
5810
+ 1
5811
+ 1
5812
+ 2
5813
+ 1
5814
+ 1
5815
+ 1
5816
+ 1
5817
+ 1
5818
+ 1
5819
+ 1
5820
+ 1
5821
+ 1
5822
+ 1
5823
+ 1
5824
+ 1
5825
+ 1
5826
+ 1
5827
+ 1
5828
+ 1
5829
+ 1
5830
+ 1
5831
+ 1
5832
+ 1
5833
+ 1
5834
+ 1
5835
+ 1
5836
+ 1
5837
+ 1
5838
+ 1
5839
+ 1
5840
+ 1
5841
+ 1
5842
+ 1
5843
+ 1
5844
+ 1
5845
+ 1
5846
+ 1
5847
+ 1
5848
+ 1
5849
+ 1
5850
+ 1
5851
+ 1
5852
+ 1
5853
+ 1
5854
+ 1
5855
+ 1
5856
+ 1
5857
+ 1
5858
+ 1
5859
+ 1
5860
+ 1
5861
+ 2
5862
+ 1
5863
+ 1
5864
+ 1
5865
+ 1
5866
+ 1
5867
+ 1
5868
+ 1
5869
+ 1
5870
+ 1
5871
+ 1
5872
+ 1
5873
+ 1
5874
+ 1
5875
+ 1
5876
+ 1
5877
+ 1
5878
+ 1
5879
+ 1
5880
+ 1
5881
+ 1
5882
+ 2
5883
+ 1
5884
+ 1
5885
+ 1
5886
+ 1
5887
+ 1
5888
+ 1
5889
+ 1
5890
+ 1
5891
+ 1
5892
+ 1
5893
+ 1
5894
+ 1
5895
+ 1
5896
+ 2
5897
+ 1
5898
+ 1
5899
+ 1
5900
+ 1
5901
+ 1
5902
+ 1
5903
+ 1
5904
+ 1
5905
+ 1
5906
+ 1
5907
+ 1
5908
+ 1
5909
+ 1
5910
+ 1
5911
+ 1
5912
+ 1
5913
+ 2
5914
+ 1
5915
+ 1
5916
+ 2
5917
+ 1
5918
+ 1
5919
+ 1
5920
+ 1
5921
+ 1
5922
+ 1
5923
+ 1
5924
+ 1
5925
+ 1
5926
+ 1
5927
+ 1
5928
+ 1
5929
+ 1
5930
+ 1
5931
+ 1
5932
+ 1
5933
+ 1
5934
+ 1
5935
+ 1
5936
+ 1
5937
+ 1
5938
+ 1
5939
+ 1
5940
+ 1
5941
+ 2
5942
+ 1
5943
+ 1
5944
+ 1
5945
+ 1
5946
+ 1
5947
+ 1
5948
+ 1
5949
+ 1
5950
+ 1
5951
+ 1
5952
+ 1
5953
+ 2
5954
+ 1
5955
+ 1
5956
+ 1
5957
+ 1
5958
+ 1
5959
+ 1
5960
+ 1
5961
+ 1
5962
+ 1
5963
+ 1
5964
+ 1
5965
+ 1
5966
+ 1
5967
+ 2
5968
+ 1
5969
+ 1
5970
+ 1
5971
+ 1
5972
+ 1
5973
+ 1
5974
+ 1
5975
+ 1
5976
+ 1
5977
+ 1
5978
+ 2
5979
+ 1
5980
+ 1
5981
+ 1
5982
+ 1
5983
+ 1
5984
+ 1
5985
+ 1
5986
+ 1
5987
+ 1
5988
+ 1
5989
+ 2
5990
+ 1
5991
+ 1
5992
+ 1
5993
+ 1
5994
+ 1
5995
+ 1
5996
+ 1
5997
+ 1
5998
+ 1
5999
+ 1
6000
+ 1
6001
+ 1
6002
+ 1
6003
+ 1
6004
+ 1
6005
+ 1
6006
+ 1
6007
+ 1
6008
+ 2
6009
+ 1
6010
+ 1
6011
+ 1
6012
+ 1
6013
+ 1
6014
+ 1
6015
+ 1
6016
+ 1
6017
+ 1
6018
+ 1
6019
+ 1
6020
+ 1
6021
+ 1
6022
+ 1
6023
+ 1
6024
+ 1
6025
+ 1
6026
+ 1
6027
+ 1
6028
+ 1
6029
+ 1
6030
+ 1
6031
+ 1
6032
+ 1
6033
+ 1
6034
+ 1
6035
+ 1
6036
+ 1
6037
+ 1
6038
+ 2
6039
+ 1
6040
+ 1
6041
+ 1
6042
+ 1
6043
+ 1
6044
+ 1
6045
+ 1
6046
+ 1
6047
+ 1
6048
+ 1
6049
+ 1
6050
+ 1
6051
+ 1
6052
+ 1
6053
+ 1
6054
+ 1
6055
+ 1
6056
+ 1
6057
+ 1
6058
+ 1
6059
+ 1
6060
+ 1
6061
+ 1
6062
+ 2
6063
+ 1
6064
+ 1
6065
+ 1
6066
+ 1
6067
+ 1
6068
+ 1
6069
+ 1
6070
+ 2
6071
+ 1
6072
+ 1
6073
+ 1
6074
+ 1
6075
+ 1
6076
+ 1
6077
+ 1
6078
+ 1
6079
+ 1
6080
+ 1
6081
+ 2
6082
+ 1
6083
+ 1
6084
+ 1
6085
+ 1
6086
+ 1
6087
+ 1
6088
+ 1
6089
+ 1
6090
+ 1
6091
+ 1
6092
+ 1
6093
+ 1
6094
+ 1
6095
+ 1
6096
+ 1
6097
+ 1
6098
+ 1
6099
+ 1
6100
+ 1
6101
+ 1
6102
+ 1
6103
+ 1
6104
+ 1
6105
+ 1
6106
+ 1
6107
+ 1
6108
+ 1
6109
+ 1
6110
+ 1
6111
+ 1
6112
+ 2
6113
+ 1
6114
+ 1
6115
+ 1
6116
+ 1
6117
+ 1
6118
+ 1
6119
+ 1
6120
+ 1
6121
+ 1
6122
+ 1
6123
+ 1
6124
+ 1
6125
+ 1
6126
+ 1
6127
+ 1
6128
+ 2
6129
+ 1
6130
+ 1
6131
+ 1
6132
+ 1
6133
+ 1
6134
+ 1
6135
+ 1
6136
+ 1
6137
+ 1
6138
+ 1
6139
+ 1
6140
+ 1
6141
+ 1
6142
+ 1
6143
+ 1
6144
+ 1
6145
+ 1
6146
+ 1
6147
+ 2
6148
+ 1
6149
+ 1
6150
+ 1
6151
+ 1
6152
+ 1
6153
+ 1
6154
+ 1
6155
+ 1
6156
+ 1
6157
+ 1
6158
+ 1
6159
+ 1
6160
+ 1
6161
+ 1
6162
+ 2
6163
+ 1
6164
+ 1
6165
+ 1
6166
+ 1
6167
+ 2
6168
+ 1
6169
+ 2
6170
+ 1
6171
+ 1
6172
+ 1
6173
+ 1
6174
+ 1
6175
+ 1
6176
+ 1
6177
+ 1
6178
+ 1
6179
+ 2
6180
+ 1
6181
+ 1
6182
+ 1
6183
+ 2
6184
+ 1
6185
+ 1
6186
+ 1
6187
+ 1
6188
+ 1
6189
+ 1
6190
+ 1
6191
+ 2
6192
+ 1
6193
+ 1
6194
+ 1
6195
+ 1
6196
+ 1
6197
+ 1
6198
+ 1
6199
+ 1
6200
+ 1
6201
+ 1
6202
+ 1
6203
+ 1
6204
+ 1
6205
+ 1
6206
+ 1
6207
+ 1
6208
+ 1
6209
+ 1
6210
+ 1
6211
+ 1
6212
+ 1
6213
+ 1
6214
+ 1
6215
+ 1
6216
+ 1
6217
+ 1
6218
+ 1
6219
+ 1
6220
+ 1
6221
+ 2
6222
+ 1
6223
+ 1
6224
+ 1
6225
+ 1
6226
+ 1
6227
+ 1
6228
+ 1
6229
+ 1
6230
+ 1
6231
+ 1
6232
+ 1
6233
+ 1
6234
+ 1
6235
+ 1
6236
+ 2
6237
+ 1
6238
+ 1
6239
+ 1
6240
+ 1
6241
+ 1
6242
+ 1
6243
+ 1
6244
+ 1
6245
+ 1
6246
+ 1
6247
+ 1
6248
+ 1
6249
+ 1
6250
+ 1
6251
+ 1
6252
+ 1
6253
+ 1
6254
+ 2
6255
+ 1
6256
+ 1
6257
+ 1
6258
+ 1
6259
+ 1
6260
+ 1
6261
+ 1
6262
+ 1
6263
+ 1
6264
+ 1
6265
+ 1
6266
+ 1
6267
+ 1
6268
+ 1
6269
+ 1
6270
+ 1
6271
+ 2
6272
+ 1
6273
+ 1
6274
+ 1
6275
+ 1
6276
+ 1
6277
+ 1
6278
+ 1
6279
+ 1
6280
+ 1
6281
+ 1
6282
+ 1
6283
+ 1
6284
+ 1
6285
+ 1
6286
+ 1
6287
+ 1
6288
+ 1
6289
+ 1
6290
+ 1
6291
+ 1
6292
+ 1
6293
+ 1
6294
+ 1
6295
+ 1
6296
+ 1
6297
+ 1
6298
+ 1
6299
+ 1
6300
+ 1
6301
+ 1
6302
+ 1
6303
+ 1
6304
+ 1
6305
+ 1
6306
+ 1
6307
+ 1
6308
+ 1
6309
+ 1
6310
+ 1
6311
+ 1
6312
+ 1
6313
+ 1
6314
+ 1
6315
+ 1
6316
+ 1
6317
+ 1
6318
+ 1
6319
+ 1
6320
+ 1
6321
+ 1
6322
+ 1
6323
+ 1
6324
+ 1
6325
+ 1
6326
+ 1
6327
+ 1
6328
+ 1
6329
+ 1
6330
+ 1
6331
+ 1
6332
+ 1
6333
+ 1
6334
+ 1
6335
+ 1
6336
+ 1
6337
+ 1
6338
+ 1
6339
+ 1
6340
+ 1
6341
+ 1
6342
+ 1
6343
+ 1
6344
+ 2
6345
+ 1
6346
+ 1
6347
+ 1
6348
+ 1
6349
+ 1
6350
+ 1
6351
+ 1
6352
+ 1
6353
+ 1
6354
+ 1
6355
+ 1
6356
+ 1
6357
+ 1
6358
+ 1
6359
+ 1
6360
+ 1
6361
+ 1
6362
+ 1
6363
+ 1
6364
+ 1
6365
+ 1
6366
+ 1
6367
+ 1
6368
+ 1
6369
+ 1
6370
+ 1
6371
+ 1
6372
+ 1
6373
+ 2
6374
+ 1
6375
+ 1
6376
+ 1
6377
+ 1
6378
+ 1
6379
+ 1
6380
+ 2
6381
+ 1
6382
+ 1
6383
+ 1
6384
+ 1
6385
+ 1
6386
+ 1
6387
+ 1
6388
+ 1
6389
+ 1
6390
+ 1
6391
+ 1
6392
+ 1
6393
+ 1
6394
+ 1
6395
+ 1
6396
+ 1
6397
+ 1
6398
+ 1
6399
+ 1
6400
+ 1
6401
+ 1
6402
+ 1
6403
+ 1
6404
+ 1
6405
+ 1
6406
+ 1
6407
+ 1
6408
+ 1
6409
+ 1
6410
+ 1
6411
+ 2
6412
+ 2
6413
+ 1
6414
+ 1
6415
+ 1
6416
+ 1
6417
+ 1
6418
+ 1
6419
+ 1
6420
+ 1
6421
+ 1
6422
+ 1
6423
+ 1
6424
+ 1
6425
+ 1
6426
+ 1
6427
+ 1
6428
+ 1
6429
+ 1
6430
+ 1
6431
+ 1
6432
+ 1
6433
+ 1
6434
+ 1
6435
+ 1
6436
+ 1
6437
+ 1
6438
+ 1
6439
+ 1
6440
+ 1
6441
+ 1
6442
+ 1
6443
+ 2
6444
+ 1
6445
+ 1
6446
+ 1
6447
+ 1
6448
+ 1
6449
+ 1
6450
+ 1
6451
+ 1
6452
+ 1
6453
+ 1
6454
+ 2
6455
+ 1
6456
+ 1
6457
+ 1
6458
+ 1
6459
+ 1
6460
+ 1
6461
+ 1
6462
+ 1
6463
+ 1
6464
+ 1
6465
+ 1
6466
+ 1
6467
+ 1
6468
+ 1
6469
+ 1
6470
+ 1
6471
+ 1
6472
+ 1
6473
+ 1
6474
+ 1
6475
+ 1
6476
+ 1
6477
+ 1
6478
+ 1
6479
+ 1
6480
+ 1
6481
+ 1
6482
+ 2
6483
+ 1
6484
+ 1
6485
+ 1
6486
+ 1
6487
+ 1
6488
+ 1
6489
+ 1
6490
+ 1
6491
+ 1
6492
+ 1
6493
+ 1
6494
+ 1
6495
+ 1
6496
+ 1
6497
+ 1
6498
+ 1
6499
+ 2
6500
+ 1
6501
+ 2
6502
+ 1
6503
+ 1
6504
+ 1
6505
+ 1
6506
+ 1
6507
+ 1
6508
+ 1
6509
+ 1
6510
+ 2
6511
+ 1
6512
+ 1
6513
+ 1
6514
+ 1
6515
+ 1
6516
+ 1
6517
+ 1
6518
+ 1
6519
+ 1
6520
+ 1
6521
+ 1
6522
+ 1
6523
+ 1
6524
+ 1
6525
+ 1
6526
+ 1
6527
+ 1
6528
+ 1
6529
+ 1
6530
+ 1
6531
+ 1
6532
+ 1
6533
+ 2
6534
+ 1
6535
+ 1
6536
+ 1
6537
+ 1
6538
+ 1
6539
+ 1
6540
+ 1
6541
+ 1
6542
+ 2
6543
+ 1
6544
+ 2
6545
+ 1
6546
+ 1
6547
+ 1
6548
+ 1
6549
+ 1
6550
+ 1
6551
+ 1
6552
+ 1
6553
+ 1
6554
+ 1
6555
+ 1
6556
+ 1
6557
+ 1
6558
+ 1
6559
+ 1
6560
+ 1
6561
+ 2
6562
+ 1
6563
+ 1
6564
+ 1
6565
+ 1
6566
+ 1
6567
+ 1
6568
+ 1
6569
+ 1
6570
+ 1
6571
+ 1
6572
+ 1
6573
+ 1
6574
+ 1
6575
+ 1
6576
+ 1
6577
+ 2
6578
+ 1
6579
+ 1
6580
+ 1
6581
+ 2
6582
+ 1
6583
+ 1
6584
+ 1
6585
+ 1
6586
+ 1
6587
+ 1
6588
+ 1
6589
+ 1
6590
+ 1
6591
+ 1
6592
+ 1
6593
+ 1
6594
+ 1
6595
+ 2
6596
+ 2
6597
+ 1
6598
+ 1
6599
+ 1
6600
+ 1
6601
+ 1
6602
+ 1
6603
+ 1
6604
+ 1
6605
+ 1
6606
+ 1
6607
+ 1
6608
+ 1
6609
+ 1
6610
+ 2
6611
+ 1
6612
+ 1
6613
+ 1
6614
+ 1
6615
+ 1
6616
+ 1
6617
+ 1
6618
+ 1
6619
+ 1
6620
+ 1
6621
+ 1
6622
+ 1
6623
+ 1
6624
+ 1
6625
+ 1
6626
+ 2
6627
+ 1
6628
+ 1
6629
+ 1
6630
+ 2
6631
+ 1
6632
+ 1
6633
+ 1
6634
+ 1
6635
+ 1
6636
+ 1
6637
+ 1
6638
+ 1
6639
+ 1
6640
+ 1
6641
+ 1
6642
+ 1
6643
+ 1
6644
+ 1
6645
+ 2
6646
+ 1
6647
+ 1
6648
+ 1
6649
+ 1
6650
+ 1
6651
+ 1
6652
+ 1
6653
+ 1
6654
+ 1
6655
+ 1
6656
+ 1
6657
+ 1
6658
+ 1
6659
+ 2
6660
+ 1
6661
+ 1
6662
+ 1
6663
+ 1
6664
+ 1
6665
+ 1
6666
+ 1
6667
+ 1
6668
+ 1
6669
+ 1
6670
+ 1
6671
+ 1
6672
+ 1
6673
+ 1
6674
+ 2
6675
+ 1
6676
+ 1
6677
+ 1
6678
+ 1
6679
+ 1
6680
+ 1
6681
+ 2
6682
+ 1
6683
+ 1
6684
+ 1
6685
+ 1
6686
+ 1
6687
+ 1
6688
+ 1
6689
+ 1
6690
+ 1
6691
+ 1
6692
+ 1
6693
+ 1
6694
+ 1
6695
+ 1
6696
+ 1
6697
+ 1
6698
+ 1
6699
+ 2
6700
+ 2
6701
+ 1
6702
+ 1
6703
+ 2
6704
+ 1
6705
+ 1
6706
+ 2
6707
+ 1
6708
+ 1
6709
+ 1
6710
+ 1
6711
+ 1
6712
+ 1
6713
+ 1
6714
+ 1
6715
+ 1
6716
+ 1
6717
+ 1
6718
+ 1
6719
+ 1
6720
+ 1
6721
+ 1
6722
+ 1
6723
+ 1
6724
+ 1
6725
+ 1
6726
+ 1
6727
+ 1
6728
+ 1
6729
+ 1
6730
+ 1
6731
+ 1
6732
+ 1
6733
+ 1
6734
+ 1
6735
+ 1
6736
+ 1
6737
+ 1
6738
+ 1
6739
+ 1
6740
+ 1
6741
+ 1
6742
+ 2
6743
+ 1
6744
+ 1
6745
+ 1
6746
+ 1
6747
+ 1
6748
+ 1
6749
+ 1
6750
+ 1
6751
+ 1
6752
+ 1
6753
+ 1
6754
+ 1
6755
+ 1
6756
+ 1
6757
+ 1
6758
+ 1
6759
+ 1
6760
+ 2
6761
+ 1
6762
+ 1
6763
+ 1
6764
+ 1
6765
+ 1
6766
+ 1
6767
+ 1
6768
+ 1
6769
+ 1
6770
+ 1
6771
+ 1
6772
+ 1
6773
+ 1
6774
+ 1
6775
+ 1
6776
+ 1
6777
+ 1
6778
+ 1
6779
+ 1
6780
+ 1
6781
+ 1
6782
+ 1
6783
+ 1
6784
+ 1
6785
+ 1
6786
+ 2
6787
+ 1
6788
+ 1
6789
+ 1
6790
+ 1
6791
+ 1
6792
+ 1
6793
+ 2
6794
+ 1
6795
+ 2
6796
+ 1
6797
+ 1
6798
+ 1
6799
+ 1
6800
+ 1
6801
+ 1
6802
+ 1
6803
+ 1
6804
+ 1
6805
+ 1
6806
+ 1
6807
+ 1
6808
+ 1
6809
+ 1
6810
+ 2
6811
+ 2
6812
+ 1
6813
+ 1
6814
+ 1
6815
+ 1
6816
+ 1
6817
+ 1
6818
+ 1
6819
+ 1
6820
+ 1
6821
+ 1
6822
+ 1
6823
+ 1
6824
+ 1
6825
+ 1
6826
+ 1
6827
+ 1
6828
+ 1
6829
+ 1
6830
+ 1
6831
+ 2
6832
+ 1
6833
+ 1
6834
+ 1
6835
+ 1
6836
+ 1
6837
+ 1
6838
+ 1
6839
+ 2
6840
+ 1
6841
+ 1
6842
+ 1
6843
+ 1
6844
+ 1
6845
+ 1
6846
+ 1
6847
+ 1
6848
+ 1
6849
+ 1
6850
+ 1
6851
+ 1
6852
+ 1
6853
+ 1
6854
+ 1
6855
+ 1
6856
+ 1
6857
+ 1
6858
+ 1
6859
+ 1
6860
+ 1
6861
+ 1
6862
+ 1
6863
+ 1
6864
+ 1
6865
+ 1
6866
+ 1
6867
+ 1
6868
+ 1
6869
+ 1
6870
+ 2
6871
+ 1
6872
+ 2
6873
+ 1
6874
+ 1
6875
+ 1
6876
+ 1
6877
+ 1
6878
+ 1
6879
+ 1
6880
+ 1
6881
+ 1
6882
+ 1
6883
+ 1
6884
+ 1
6885
+ 1
6886
+ 1
6887
+ 1
6888
+ 1
6889
+ 1
6890
+ 2
6891
+ 1
6892
+ 1
6893
+ 1
6894
+ 1
6895
+ 1
6896
+ 1
6897
+ 1
6898
+ 1
6899
+ 1
6900
+ 1
6901
+ 1
6902
+ 1
6903
+ 1
6904
+ 1
6905
+ 1
6906
+ 1
6907
+ 1
6908
+ 1
6909
+ 1
6910
+ 1
6911
+ 1
6912
+ 1
6913
+ 1
6914
+ 1
6915
+ 1
6916
+ 1
6917
+ 1
6918
+ 1
6919
+ 1
6920
+ 1
6921
+ 1
6922
+ 1
6923
+ 1
6924
+ 1
6925
+ 1
6926
+ 2
6927
+ 1
6928
+ 1
6929
+ 1
6930
+ 1
6931
+ 1
6932
+ 1
6933
+ 1
6934
+ 1
6935
+ 1
6936
+ 1
6937
+ 1
6938
+ 1
6939
+ 1
6940
+ 1
6941
+ 1
6942
+ 1
6943
+ 1
6944
+ 1
6945
+ 1
6946
+ 1
6947
+ 1
6948
+ 1
6949
+ 1
6950
+ 1
6951
+ 1
6952
+ 1
6953
+ 1
6954
+ 1
6955
+ 1
6956
+ 1
6957
+ 1
6958
+ 1
6959
+ 1
6960
+ 1
6961
+ 1
6962
+ 1
6963
+ 1
6964
+ 1
6965
+ 1
6966
+ 1
6967
+ 1
6968
+ 1
6969
+ 1
6970
+ 1
6971
+ 1
6972
+ 1
6973
+ 1
6974
+ 1
6975
+ 1
6976
+ 1
6977
+ 1
6978
+ 1
6979
+ 1
6980
+ 1
6981
+ 1
6982
+ 1
6983
+ 1
6984
+ 1
6985
+ 1
6986
+ 1
6987
+ 1
6988
+ 1
6989
+ 1
6990
+ 1
6991
+ 1
6992
+ 1
6993
+ 1
6994
+ 1
6995
+ 1
6996
+ 2
6997
+ 1
6998
+ 1
6999
+ 1
7000
+ 1
7001
+ 1
7002
+ 1
7003
+ 1
7004
+ 2
7005
+ 1
7006
+ 1
7007
+ 1
7008
+ 1
7009
+ 1
7010
+ 1
7011
+ 1
7012
+ 1
7013
+ 1
7014
+ 1
7015
+ 1
7016
+ 1
7017
+ 1
7018
+ 1
7019
+ 1
7020
+ 1
7021
+ 1
7022
+ 1
7023
+ 1
7024
+ 1
7025
+ 1
7026
+ 1
7027
+ 2
7028
+ 1
7029
+ 1
7030
+ 2
7031
+ 1
7032
+ 1
7033
+ 1
7034
+ 1
7035
+ 1
7036
+ 1
7037
+ 1
7038
+ 1
7039
+ 1
7040
+ 1
7041
+ 1
7042
+ 1
7043
+ 1
7044
+ 1
7045
+ 1
7046
+ 1
7047
+ 1
7048
+ 1
7049
+ 1
7050
+ 1
7051
+ 1
7052
+ 1
7053
+ 1
7054
+ 1
7055
+ 1
7056
+ 1
7057
+ 1
7058
+ 1
7059
+ 1
7060
+ 1
7061
+ 1
7062
+ 1
7063
+ 1
7064
+ 1
7065
+ 1
7066
+ 1
7067
+ 1
7068
+ 1
7069
+ 1
7070
+ 1
7071
+ 1
7072
+ 1
7073
+ 1
7074
+ 1
7075
+ 1
7076
+ 1
7077
+ 1
7078
+ 1
7079
+ 1
7080
+ 1
7081
+ 2
7082
+ 1
7083
+ 2
7084
+ 1
7085
+ 1
7086
+ 1
7087
+ 1
7088
+ 1
7089
+ 1
7090
+ 1
7091
+ 1
7092
+ 1
7093
+ 1
7094
+ 1
7095
+ 1
7096
+ 1
7097
+ 1
7098
+ 2
7099
+ 1
7100
+ 1
7101
+ 1
7102
+ 1
7103
+ 2
7104
+ 1
7105
+ 1
7106
+ 1
7107
+ 1
7108
+ 1
7109
+ 1
7110
+ 1
7111
+ 1
7112
+ 1
7113
+ 1
7114
+ 1
7115
+ 1
7116
+ 1
7117
+ 2
7118
+ 1
7119
+ 1
7120
+ 1
7121
+ 1
7122
+ 1
7123
+ 1
7124
+ 1
7125
+ 1
7126
+ 1
7127
+ 1
7128
+ 1
7129
+ 1
7130
+ 1
7131
+ 1
7132
+ 1
7133
+ 1
7134
+ 1
7135
+ 1
7136
+ 1
7137
+ 1
7138
+ 1
7139
+ 1
7140
+ 1
7141
+ 1
7142
+ 1
7143
+ 1
7144
+ 1
7145
+ 1
7146
+ 1
7147
+ 1
7148
+ 1
7149
+ 1
7150
+ 1
7151
+ 1
7152
+ 1
7153
+ 1
7154
+ 1
7155
+ 1
7156
+ 1
7157
+ 1
7158
+ 1
7159
+ 1
7160
+ 1
7161
+ 1
7162
+ 1
7163
+ 1
7164
+ 1
7165
+ 1
7166
+ 2
7167
+ 1
7168
+ 1
7169
+ 1
7170
+ 1
7171
+ 1
7172
+ 1
7173
+ 1
7174
+ 1
7175
+ 1
7176
+ 1
7177
+ 1
7178
+ 1
7179
+ 1
7180
+ 1
7181
+ 1
7182
+ 1
7183
+ 1
7184
+ 1
7185
+ 1
7186
+ 1
7187
+ 1
7188
+ 1
7189
+ 1
7190
+ 1
7191
+ 1
7192
+ 1
7193
+ 1
7194
+ 1
7195
+ 1
7196
+ 1
7197
+ 1
7198
+ 1
7199
+ 1
7200
+ 1
7201
+ 2
7202
+ 1
7203
+ 1
7204
+ 1
7205
+ 1
7206
+ 1
7207
+ 1
7208
+ 1
7209
+ 1
7210
+ 1
7211
+ 1
7212
+ 1
7213
+ 1
7214
+ 1
7215
+ 1
7216
+ 1
7217
+ 1
7218
+ 1
7219
+ 1
7220
+ 1
7221
+ 1
7222
+ 1
7223
+ 1
7224
+ 1
7225
+ 1
7226
+ 1
7227
+ 1
7228
+ 1
7229
+ 1
7230
+ 1
7231
+ 1
7232
+ 1
7233
+ 2
7234
+ 1
7235
+ 1
7236
+ 1
7237
+ 1
7238
+ 1
7239
+ 1
7240
+ 1
7241
+ 1
7242
+ 1
7243
+ 1
7244
+ 1
7245
+ 1
7246
+ 1
7247
+ 1
7248
+ 1
7249
+ 1
7250
+ 1
7251
+ 1
7252
+ 1
7253
+ 1
7254
+ 1
7255
+ 1
7256
+ 1
7257
+ 1
7258
+ 1
7259
+ 1
7260
+ 1
7261
+ 1
7262
+ 1
7263
+ 1
7264
+ 1
7265
+ 1
7266
+ 1
7267
+ 1
7268
+ 1
7269
+ 1
7270
+ 1
7271
+ 1
7272
+ 2
7273
+ 1
7274
+ 1
7275
+ 1
7276
+ 1
7277
+ 1
7278
+ 1
7279
+ 1
7280
+ 1
7281
+ 1
7282
+ 1
7283
+ 2
7284
+ 1
7285
+ 1
7286
+ 1
7287
+ 1
7288
+ 1
7289
+ 1
7290
+ 1
7291
+ 1
7292
+ 1
7293
+ 1
7294
+ 1
7295
+ 1
7296
+ 1
7297
+ 1
7298
+ 1
7299
+ 1
7300
+ 1
7301
+ 1
7302
+ 1
7303
+ 1
7304
+ 1
7305
+ 1
7306
+ 1
7307
+ 1
7308
+ 1
7309
+ 1
7310
+ 1
7311
+ 1
7312
+ 1
7313
+ 1
7314
+ 1
7315
+ 1
7316
+ 1
7317
+ 1
7318
+ 1
7319
+ 1
7320
+ 1
7321
+ 1
7322
+ 1
7323
+ 1
7324
+ 1
7325
+ 2
7326
+ 1
7327
+ 1
7328
+ 1
7329
+ 1
7330
+ 1
7331
+ 1
7332
+ 1
7333
+ 1
7334
+ 2
7335
+ 1
7336
+ 2
7337
+ 1
7338
+ 1
7339
+ 1
7340
+ 1
7341
+ 1
7342
+ 1
7343
+ 1
7344
+ 1
7345
+ 1
7346
+ 1
7347
+ 1
7348
+ 1
7349
+ 1
7350
+ 1
7351
+ 1
7352
+ 1
7353
+ 1
7354
+ 1
7355
+ 1
7356
+ 1
7357
+ 1
7358
+ 1
7359
+ 1
7360
+ 1
7361
+ 1
7362
+ 1
7363
+ 1
7364
+ 1
7365
+ 1
7366
+ 1
7367
+ 1
7368
+ 1
7369
+ 1
7370
+ 1
7371
+ 1
7372
+ 1
7373
+ 2
7374
+ 1
7375
+ 1
7376
+ 1
7377
+ 1
7378
+ 1
7379
+ 1
7380
+ 1
7381
+ 1
7382
+ 1
7383
+ 1
7384
+ 1
7385
+ 1
7386
+ 1
7387
+ 1
7388
+ 2
7389
+ 1
7390
+ 1
7391
+ 1
7392
+ 1
7393
+ 1
7394
+ 1
7395
+ 1
7396
+ 1
7397
+ 1
7398
+ 1
7399
+ 1
7400
+ 1
7401
+ 1
7402
+ 1
7403
+ 1
7404
+ 1
7405
+ 1
7406
+ 1
7407
+ 1
7408
+ 2
7409
+ 1
7410
+ 1
7411
+ 1
7412
+ 1
7413
+ 1
7414
+ 1
7415
+ 1
7416
+ 1
7417
+ 1
7418
+ 1
7419
+ 1
7420
+ 1
7421
+ 1
7422
+ 1
7423
+ 1
7424
+ 1
7425
+ 1
7426
+ 1
7427
+ 1
7428
+ 1
7429
+ 1
7430
+ 1
7431
+ 1
7432
+ 1
7433
+ 1
7434
+ 1
7435
+ 1
7436
+ 1
7437
+ 1
7438
+ 1
7439
+ 1
7440
+ 1
7441
+ 1
7442
+ 1
7443
+ 1
7444
+ 1
7445
+ 1
7446
+ 1
7447
+ 1
7448
+ 1
7449
+ 1
7450
+ 1
7451
+ 1
7452
+ 1
7453
+ 1
7454
+ 1
7455
+ 1
7456
+ 1
7457
+ 1
7458
+ 1
7459
+ 1
7460
+ 1
7461
+ 1
7462
+ 1
7463
+ 1
7464
+ 1
7465
+ 1
7466
+ 1
7467
+ 1
7468
+ 1
7469
+ 1
7470
+ 1
7471
+ 1
7472
+ 1
7473
+ 2
7474
+ 1
7475
+ 2
7476
+ 1
7477
+ 1
7478
+ 1
7479
+ 1
7480
+ 1
7481
+ 1
7482
+ 1
7483
+ 2
7484
+ 1
7485
+ 1
7486
+ 1
7487
+ 1
7488
+ 1
7489
+ 1
7490
+ 2
7491
+ 1
7492
+ 1
7493
+ 1
7494
+ 1
7495
+ 1
7496
+ 1
7497
+ 1
7498
+ 1
7499
+ 1
7500
+ 2
7501
+ 1
7502
+ 1
7503
+ 1
7504
+ 1
7505
+ 1
7506
+ 1
7507
+ 1
7508
+ 1
7509
+ 1
7510
+ 1
7511
+ 1
7512
+ 1
7513
+ 1
7514
+ 1
7515
+ 1
7516
+ 1
7517
+ 2
7518
+ 1
7519
+ 1
7520
+ 1
7521
+ 1
7522
+ 1
7523
+ 1
7524
+ 1
7525
+ 1
7526
+ 1
7527
+ 1
7528
+ 1
7529
+ 1
7530
+ 1
7531
+ 1
7532
+ 1
7533
+ 1
7534
+ 2
7535
+ 1
7536
+ 1
7537
+ 2
7538
+ 1
7539
+ 1
7540
+ 1
7541
+ 1
7542
+ 1
7543
+ 1
7544
+ 1
7545
+ 1
7546
+ 1
7547
+ 1
7548
+ 1
7549
+ 1
7550
+ 1
7551
+ 1
7552
+ 1
7553
+ 1
7554
+ 1
7555
+ 1
7556
+ 1
7557
+ 1
7558
+ 1
7559
+ 1
7560
+ 1
7561
+ 1
7562
+ 1
7563
+ 1
7564
+ 1
7565
+ 1
7566
+ 1
7567
+ 2
7568
+ 1
7569
+ 1
7570
+ 1
7571
+ 1
7572
+ 1
7573
+ 1
7574
+ 1
7575
+ 1
7576
+ 1
7577
+ 1
7578
+ 1
7579
+ 1
7580
+ 1
7581
+ 1
7582
+ 1
7583
+ 1
7584
+ 1
7585
+ 1
7586
+ 1
7587
+ 1
7588
+ 1
7589
+ 1
7590
+ 1
7591
+ 1
7592
+ 1
7593
+ 1
7594
+ 1
7595
+ 1
7596
+ 1
7597
+ 1
7598
+ 1
7599
+ 1
7600
+ 1
7601
+ 1
7602
+ 1
7603
+ 1
7604
+ 1
7605
+ 1
7606
+ 1
7607
+ 1
7608
+ 1
7609
+ 1
7610
+ 1
7611
+ 1
7612
+ 1
7613
+ 1
7614
+ 1
7615
+ 1
7616
+ 1
7617
+ 1
7618
+ 1
7619
+ 1
7620
+ 1
7621
+ 2
7622
+ 1
7623
+ 1
7624
+ 1
7625
+ 1
7626
+ 1
7627
+ 1
7628
+ 1
7629
+ 1
7630
+ 1
7631
+ 1
7632
+ 1
7633
+ 1
7634
+ 1
7635
+ 1
7636
+ 1
7637
+ 1
7638
+ 1
7639
+ 1
7640
+ 1
7641
+ 1
7642
+ 1
7643
+ 1
7644
+ 1
7645
+ 1
7646
+ 1
7647
+ 1
7648
+ 1
7649
+ 1
7650
+ 1
7651
+ 1
7652
+ 1
7653
+ 1
7654
+ 1
7655
+ 2
7656
+ 1
7657
+ 1
7658
+ 1
7659
+ 1
7660
+ 1
7661
+ 1
7662
+ 1
7663
+ 1
7664
+ 1
7665
+ 1
7666
+ 1
7667
+ 1
7668
+ 1
7669
+ 1
7670
+ 1
7671
+ 1
7672
+ 1
7673
+ 1
7674
+ 1
7675
+ 1
7676
+ 1
7677
+ 1
7678
+ 1
7679
+ 1
7680
+ 1
7681
+ 1
7682
+ 1
7683
+ 1
7684
+ 1
7685
+ 1
7686
+ 1
7687
+ 1
7688
+ 1
7689
+ 1
7690
+ 1
7691
+ 1
7692
+ 2
7693
+ 1
7694
+ 1
7695
+ 1
7696
+ 1
7697
+ 1
7698
+ 1
7699
+ 1
7700
+ 1
7701
+ 1
7702
+ 1
7703
+ 1
7704
+ 1
7705
+ 2
7706
+ 1
7707
+ 1
7708
+ 1
7709
+ 1
7710
+ 1
7711
+ 1
7712
+ 1
7713
+ 1
7714
+ 1
7715
+ 1
7716
+ 1
7717
+ 1
7718
+ 1
7719
+ 1
7720
+ 1
7721
+ 1
7722
+ 1
7723
+ 2
7724
+ 1
7725
+ 1
7726
+ 1
7727
+ 1
7728
+ 1
7729
+ 1
7730
+ 1
7731
+ 1
7732
+ 1
7733
+ 1
7734
+ 1
7735
+ 1
7736
+ 1
7737
+ 1
7738
+ 1
7739
+ 1
7740
+ 1
7741
+ 1
7742
+ 1
7743
+ 1
7744
+ 1
7745
+ 1
7746
+ 1
7747
+ 2
7748
+ 1
7749
+ 1
7750
+ 1
7751
+ 2
7752
+ 1
7753
+ 1
7754
+ 1
7755
+ 1
7756
+ 1
7757
+ 1
7758
+ 1
7759
+ 1
7760
+ 1
7761
+ 1
7762
+ 1
7763
+ 1
7764
+ 1
7765
+ 1
7766
+ 1
7767
+ 1
7768
+ 1
7769
+ 1
7770
+ 1
7771
+ 1
7772
+ 1
7773
+ 1
7774
+ 2
7775
+ 1
7776
+ 1
7777
+ 1
7778
+ 1
7779
+ 1
7780
+ 1
7781
+ 1
7782
+ 1
7783
+ 1
7784
+ 1
7785
+ 1
7786
+ 1
7787
+ 1
7788
+ 1
7789
+ 1
7790
+ 1
7791
+ 1
7792
+ 1
7793
+ 1
7794
+ 1
7795
+ 1
7796
+ 1
7797
+ 1
7798
+ 1
7799
+ 1
7800
+ 1
7801
+ 1
7802
+ 1
7803
+ 1
7804
+ 1
7805
+ 1
7806
+ 1
7807
+ 2
7808
+ 1
7809
+ 1
7810
+ 1
7811
+ 1
7812
+ 1
7813
+ 1
7814
+ 1
7815
+ 1
7816
+ 1
7817
+ 1
7818
+ 1
7819
+ 1
7820
+ 1
7821
+ 1
7822
+ 2
7823
+ 1
7824
+ 1
7825
+ 1
7826
+ 1
7827
+ 1
7828
+ 2
7829
+ 1
7830
+ 1
7831
+ 1
7832
+ 1
7833
+ 1
7834
+ 1
7835
+ 1
7836
+ 1
7837
+ 1
7838
+ 1
7839
+ 1
7840
+ 1
7841
+ 1
7842
+ 1
7843
+ 1
7844
+ 1
7845
+ 1
7846
+ 1
7847
+ 1
7848
+ 1
7849
+ 1
7850
+ 1
7851
+ 1
7852
+ 2
7853
+ 1
7854
+ 1
7855
+ 1
7856
+ 1
7857
+ 1
7858
+ 1
7859
+ 1
7860
+ 1
7861
+ 1
7862
+ 1
7863
+ 1
7864
+ 1
7865
+ 1
7866
+ 1
7867
+ 1
7868
+ 1
7869
+ 1
7870
+ 1
7871
+ 1
7872
+ 1
7873
+ 1
7874
+ 2
7875
+ 1
7876
+ 1
7877
+ 1
7878
+ 1
7879
+ 1
7880
+ 1
7881
+ 2
7882
+ 1
7883
+ 1
7884
+ 1
7885
+ 2
7886
+ 1
7887
+ 1
7888
+ 1
7889
+ 1
7890
+ 1
7891
+ 1
7892
+ 1
7893
+ 1
7894
+ 1
7895
+ 1
7896
+ 1
7897
+ 1
7898
+ 1
7899
+ 1
7900
+ 1
7901
+ 1
7902
+ 1
7903
+ 1
7904
+ 1
7905
+ 2
7906
+ 1
7907
+ 1
7908
+ 1
7909
+ 1
7910
+ 1
7911
+ 1
7912
+ 1
7913
+ 2
7914
+ 1
7915
+ 1
7916
+ 1
7917
+ 1
7918
+ 1
7919
+ 1
7920
+ 1
7921
+ 1
7922
+ 1
7923
+ 1
7924
+ 1
7925
+ 1
7926
+ 1
7927
+ 1
7928
+ 1
7929
+ 1
7930
+ 1
7931
+ 1
7932
+ 1
7933
+ 1
7934
+ 1
7935
+ 1
7936
+ 1
7937
+ 1
7938
+ 1
7939
+ 1
7940
+ 1
7941
+ 1
7942
+ 1
7943
+ 1
7944
+ 1
7945
+ 1
7946
+ 1
7947
+ 1
7948
+ 1
7949
+ 2
7950
+ 1
7951
+ 1
7952
+ 1
7953
+ 1
7954
+ 1
7955
+ 1
7956
+ 1
7957
+ 1
7958
+ 1
7959
+ 1
7960
+ 1
7961
+ 1
7962
+ 1
7963
+ 1
7964
+ 1
7965
+ 2
7966
+ 2
7967
+ 1
7968
+ 1
7969
+ 1
7970
+ 1
7971
+ 1
7972
+ 1
7973
+ 1
7974
+ 1
7975
+ 1
7976
+ 1
7977
+ 1
7978
+ 1
7979
+ 1
7980
+ 1
7981
+ 1
7982
+ 1
7983
+ 1
7984
+ 1
7985
+ 2
7986
+ 1
7987
+ 1
7988
+ 1
7989
+ 1
7990
+ 2
7991
+ 1
7992
+ 1
7993
+ 2
7994
+ 1
7995
+ 1
7996
+ 1
7997
+ 1
7998
+ 1
7999
+ 1
8000
+ 1
8001
+ 1
8002
+ 1
8003
+ 1
8004
+ 1
8005
+ 1
8006
+ 1
8007
+ 1
8008
+ 1
8009
+ 1
8010
+ 1
8011
+ 1
8012
+ 1
8013
+ 1
8014
+ 1
8015
+ 1
8016
+ 1
8017
+ 1
8018
+ 1
8019
+ 1
8020
+ 1
8021
+ 1
8022
+ 1
8023
+ 1
8024
+ 1
8025
+ 1
8026
+ 1
8027
+ 1
8028
+ 1
8029
+ 1
8030
+ 1
8031
+ 1
8032
+ 1
8033
+ 1
8034
+ 1
8035
+ 1
8036
+ 2
8037
+ 1
8038
+ 1
8039
+ 1
8040
+ 1
8041
+ 1
8042
+ 1
8043
+ 1
8044
+ 1
8045
+ 1
8046
+ 1
8047
+ 1
8048
+ 1
8049
+ 1
8050
+ 1
8051
+ 2
8052
+ 1
8053
+ 1
8054
+ 1
8055
+ 1
8056
+ 1
8057
+ 1
8058
+ 1
8059
+ 1
8060
+ 1
8061
+ 1
8062
+ 1
8063
+ 1
8064
+ 1
8065
+ 1
8066
+ 1
8067
+ 1
8068
+ 1
8069
+ 1
8070
+ 1
8071
+ 1
8072
+ 1
8073
+ 1
8074
+ 1
8075
+ 2
8076
+ 1
8077
+ 1
8078
+ 1
8079
+ 1
8080
+ 1
8081
+ 1
8082
+ 1
8083
+ 1
8084
+ 1
8085
+ 1
8086
+ 1
8087
+ 1
8088
+ 1
8089
+ 1
8090
+ 1
8091
+ 1
8092
+ 2
8093
+ 1
8094
+ 1
8095
+ 2
8096
+ 1
8097
+ 1
8098
+ 1
8099
+ 1
8100
+ 1
8101
+ 1
8102
+ 1
8103
+ 1
8104
+ 1
8105
+ 1
8106
+ 1
8107
+ 1
8108
+ 1
8109
+ 1
8110
+ 1
8111
+ 1
8112
+ 1
8113
+ 1
8114
+ 2
8115
+ 1
8116
+ 1
8117
+ 2
8118
+ 1
8119
+ 1
8120
+ 1
8121
+ 1
8122
+ 1
8123
+ 1
8124
+ 1
8125
+ 1
8126
+ 1
8127
+ 1
8128
+ 1
8129
+ 1
8130
+ 1
8131
+ 1
8132
+ 1
8133
+ 1
8134
+ 1
8135
+ 1
8136
+ 1
8137
+ 1
8138
+ 1
8139
+ 1
8140
+ 1
8141
+ 1
8142
+ 1
8143
+ 1
8144
+ 1
8145
+ 1
8146
+ 1
8147
+ 1
8148
+ 1
8149
+ 1
8150
+ 1
8151
+ 1
8152
+ 2
8153
+ 1
8154
+ 1
8155
+ 1
8156
+ 1
8157
+ 1
8158
+ 1
8159
+ 1
8160
+ 2
8161
+ 1
8162
+ 1
8163
+ 1
8164
+ 1
8165
+ 1
8166
+ 1
8167
+ 1
8168
+ 1
8169
+ 1
8170
+ 1
8171
+ 1
8172
+ 2
8173
+ 1
8174
+ 1
8175
+ 1
8176
+ 1
8177
+ 1
8178
+ 1
8179
+ 1
8180
+ 2
8181
+ 1
8182
+ 1
8183
+ 1
8184
+ 1
8185
+ 1
8186
+ 1
8187
+ 1
8188
+ 1
8189
+ 1
8190
+ 1
8191
+ 1
8192
+ 1
8193
+ 1
8194
+ 1
8195
+ 2
8196
+ 2
8197
+ 1
8198
+ 1
8199
+ 1
8200
+ 1
8201
+ 1
8202
+ 1
8203
+ 1
8204
+ 1
8205
+ 1
8206
+ 1
8207
+ 1
8208
+ 1
8209
+ 1
8210
+ 1
8211
+ 1
8212
+ 1
8213
+ 1
8214
+ 1
8215
+ 1
8216
+ 1
8217
+ 1
8218
+ 1
8219
+ 1
8220
+ 1
8221
+ 1
8222
+ 1
8223
+ 1
8224
+ 1
8225
+ 1
8226
+ 1
8227
+ 1
8228
+ 1
8229
+ 1
8230
+ 1
8231
+ 1
8232
+ 1
8233
+ 1
8234
+ 1
8235
+ 1
8236
+ 1
8237
+ 1
8238
+ 1
8239
+ 1
8240
+ 2
8241
+ 1
8242
+ 1
8243
+ 1
8244
+ 1
8245
+ 1
8246
+ 1
8247
+ 1
8248
+ 1
8249
+ 1
8250
+ 1
8251
+ 1
8252
+ 1
8253
+ 1
8254
+ 1
8255
+ 1
8256
+ 1
8257
+ 1
8258
+ 1
8259
+ 1
8260
+ 1
8261
+ 1
8262
+ 1
8263
+ 1
8264
+ 2
8265
+ 1
8266
+ 1
8267
+ 1
8268
+ 1
8269
+ 1
8270
+ 1
8271
+ 1
8272
+ 1
8273
+ 1
8274
+ 1
8275
+ 1
8276
+ 1
8277
+ 1
8278
+ 1
8279
+ 1
8280
+ 1
8281
+ 1
8282
+ 1
8283
+ 1
8284
+ 1
8285
+ 1
8286
+ 1
8287
+ 1
8288
+ 1
8289
+ 1
8290
+ 1
8291
+ 2
8292
+ 1
8293
+ 1
8294
+ 1
8295
+ 1
8296
+ 2
8297
+ 1
8298
+ 1
8299
+ 1
8300
+ 1
8301
+ 1
8302
+ 1
8303
+ 1
8304
+ 1
8305
+ 1
8306
+ 1
8307
+ 1
8308
+ 1
8309
+ 1
8310
+ 1
8311
+ 1
8312
+ 1
8313
+ 2
8314
+ 1
8315
+ 1
8316
+ 1
8317
+ 1
8318
+ 1
8319
+ 1
8320
+ 1
8321
+ 1
8322
+ 1
8323
+ 1
8324
+ 1
8325
+ 1
8326
+ 1
8327
+ 1
8328
+ 1
8329
+ 1
8330
+ 1
8331
+ 1
8332
+ 1
8333
+ 1
8334
+ 1
8335
+ 1
8336
+ 1
8337
+ 1
8338
+ 1
8339
+ 1
8340
+ 1
8341
+ 1
8342
+ 1
8343
+ 1
8344
+ 1
8345
+ 1
8346
+ 1
8347
+ 1
8348
+ 1
8349
+ 1
8350
+ 1
8351
+ 1
8352
+ 1
8353
+ 1
8354
+ 1
8355
+ 1
8356
+ 1
8357
+ 1
8358
+ 1
8359
+ 1
8360
+ 1
8361
+ 1
8362
+ 1
8363
+ 1
8364
+ 1
8365
+ 1
8366
+ 1
8367
+ 1
8368
+ 2
8369
+ 1
8370
+ 1
8371
+ 1
8372
+ 1
8373
+ 1
8374
+ 1
8375
+ 2
8376
+ 1
8377
+ 1
8378
+ 1
8379
+ 1
8380
+ 1
8381
+ 1
8382
+ 1
8383
+ 1
8384
+ 1
8385
+ 1
8386
+ 1
8387
+ 1
8388
+ 2
8389
+ 1
8390
+ 1
8391
+ 1
8392
+ 1
8393
+ 1
8394
+ 1
8395
+ 1
8396
+ 1
8397
+ 1
8398
+ 1
8399
+ 1
8400
+ 1
8401
+ 1
8402
+ 1
8403
+ 1
8404
+ 1
8405
+ 1
8406
+ 1
8407
+ 1
8408
+ 2
8409
+ 1
8410
+ 1
8411
+ 1
8412
+ 1
8413
+ 1
8414
+ 1
8415
+ 1
8416
+ 1
8417
+ 1
8418
+ 1
8419
+ 1
8420
+ 1
8421
+ 1
8422
+ 1
8423
+ 1
8424
+ 1
8425
+ 1
8426
+ 1
8427
+ 1
8428
+ 1
8429
+ 1
8430
+ 1
8431
+ 1
8432
+ 1
8433
+ 1
8434
+ 1
8435
+ 1
8436
+ 1
8437
+ 1
8438
+ 2
8439
+ 1
8440
+ 2
8441
+ 1
8442
+ 1
8443
+ 1
8444
+ 1
8445
+ 1
8446
+ 1
8447
+ 1
8448
+ 1
8449
+ 1
8450
+ 1
8451
+ 1
8452
+ 1
8453
+ 1
8454
+ 1
8455
+ 1
8456
+ 1
8457
+ 1
8458
+ 1
8459
+ 1
8460
+ 1
8461
+ 1
8462
+ 1
8463
+ 1
8464
+ 1
8465
+ 1
8466
+ 1
8467
+ 1
8468
+ 1
8469
+ 1
8470
+ 1
8471
+ 1
8472
+ 1
8473
+ 1
8474
+ 1
8475
+ 1
8476
+ 1
8477
+ 1
8478
+ 1
8479
+ 1
8480
+ 1
8481
+ 1
8482
+ 1
8483
+ 1
8484
+ 1
8485
+ 1
8486
+ 1
8487
+ 1
8488
+ 1
8489
+ 1
8490
+ 1
8491
+ 1
8492
+ 1
8493
+ 1
8494
+ 1
8495
+ 1
8496
+ 1
8497
+ 1
8498
+ 1
8499
+ 1
8500
+ 1
8501
+ 1
8502
+ 1
8503
+ 1
8504
+ 1
8505
+ 1
8506
+ 1
8507
+ 1
8508
+ 1
8509
+ 1
8510
+ 1
8511
+ 1
8512
+ 1
8513
+ 1
8514
+ 1
8515
+ 1
8516
+ 1
8517
+ 1
8518
+ 1
8519
+ 2
8520
+ 1
8521
+ 1
8522
+ 1
8523
+ 1
8524
+ 1
8525
+ 1
8526
+ 1
8527
+ 1
8528
+ 1
8529
+ 1
8530
+ 1
8531
+ 1
8532
+ 1
8533
+ 1
8534
+ 1
8535
+ 1
8536
+ 1
8537
+ 1
8538
+ 1
8539
+ 1
8540
+ 1
8541
+ 1
8542
+ 1
8543
+ 1
8544
+ 1
8545
+ 1
8546
+ 1
8547
+ 1
8548
+ 1
8549
+ 1
8550
+ 1
8551
+ 1
8552
+ 1
8553
+ 1
8554
+ 1
8555
+ 1
8556
+ 1
8557
+ 2
8558
+ 1
8559
+ 1
8560
+ 1
8561
+ 1
8562
+ 1
8563
+ 1
8564
+ 1
8565
+ 1
8566
+ 1
8567
+ 1
8568
+ 1
8569
+ 1
8570
+ 1
8571
+ 1
8572
+ 1
8573
+ 1
8574
+ 1
8575
+ 1
8576
+ 1
8577
+ 1
8578
+ 1
8579
+ 1
8580
+ 1
8581
+ 1
8582
+ 1
8583
+ 1
8584
+ 1
8585
+ 1
8586
+ 1
8587
+ 1
8588
+ 1
8589
+ 2
8590
+ 1
8591
+ 1
8592
+ 1
8593
+ 1
8594
+ 1
8595
+ 1
8596
+ 1
8597
+ 1
8598
+ 2
8599
+ 1
8600
+ 1
8601
+ 1
8602
+ 2
8603
+ 1
8604
+ 1
8605
+ 1
8606
+ 1
8607
+ 1
8608
+ 1
8609
+ 1
8610
+ 1
8611
+ 1
8612
+ 1
8613
+ 1
8614
+ 1
8615
+ 1
8616
+ 1
8617
+ 1
8618
+ 1
8619
+ 1
8620
+ 1
8621
+ 1
8622
+ 1
8623
+ 1
8624
+ 1
8625
+ 1
8626
+ 1
8627
+ 1
8628
+ 1
8629
+ 1
8630
+ 1
8631
+ 1
8632
+ 1
8633
+ 1
8634
+ 1
8635
+ 1
8636
+ 1
8637
+ 1
8638
+ 1
8639
+ 1
8640
+ 1
8641
+ 1
8642
+ 1
8643
+ 1
8644
+ 1
8645
+ 1
8646
+ 1
8647
+ 1
8648
+ 1
8649
+ 1
8650
+ 1
8651
+ 1
8652
+ 2
8653
+ 1
8654
+ 1
8655
+ 1
8656
+ 1
8657
+ 1
8658
+ 2
8659
+ 1
8660
+ 1
8661
+ 1
8662
+ 1
8663
+ 1
8664
+ 1
8665
+ 1
8666
+ 1
8667
+ 1
8668
+ 1
8669
+ 1
8670
+ 1
8671
+ 1
8672
+ 1
8673
+ 1
8674
+ 1
8675
+ 1
8676
+ 1
8677
+ 1
8678
+ 1
8679
+ 1
8680
+ 1
8681
+ 1
8682
+ 1
8683
+ 1
8684
+ 1
8685
+ 1
8686
+ 1
8687
+ 1
8688
+ 1
8689
+ 1
8690
+ 1
8691
+ 1
8692
+ 1
8693
+ 1
8694
+ 1
8695
+ 1
8696
+ 1
8697
+ 1
8698
+ 1
8699
+ 1
8700
+ 1
8701
+ 1
8702
+ 1
8703
+ 1
8704
+ 1
8705
+ 1
8706
+ 1
8707
+ 1
8708
+ 1
8709
+ 1
8710
+ 1
8711
+ 1
8712
+ 1
8713
+ 1
8714
+ 1
8715
+ 1
8716
+ 1
8717
+ 1
8718
+ 1
8719
+ 1
8720
+ 1
8721
+ 1
8722
+ 1
8723
+ 1
8724
+ 2
8725
+ 1
8726
+ 1
8727
+ 1
8728
+ 1
8729
+ 1
8730
+ 1
8731
+ 1
8732
+ 1
8733
+ 1
8734
+ 1
8735
+ 1
8736
+ 1
8737
+ 1
8738
+ 1
8739
+ 1
8740
+ 1
8741
+ 1
8742
+ 1
8743
+ 1
8744
+ 1
8745
+ 1
8746
+ 1
8747
+ 1
8748
+ 1
8749
+ 1
8750
+ 1
8751
+ 1
8752
+ 1
8753
+ 1
8754
+ 1
8755
+ 1
8756
+ 1
8757
+ 1
8758
+ 1
8759
+ 1
8760
+ 2
8761
+ 1
8762
+ 1
8763
+ 1
8764
+ 2
8765
+ 1
8766
+ 1
8767
+ 1
8768
+ 1
8769
+ 1
8770
+ 1
8771
+ 1
8772
+ 1
8773
+ 1
8774
+ 1
8775
+ 1
8776
+ 1
8777
+ 1
8778
+ 1
8779
+ 1
8780
+ 1
8781
+ 1
8782
+ 1
8783
+ 1
8784
+ 1
8785
+ 1
8786
+ 2
8787
+ 1
8788
+ 1
8789
+ 1
8790
+ 1
8791
+ 1
8792
+ 1
8793
+ 1
8794
+ 1
8795
+ 1
8796
+ 1
8797
+ 1
8798
+ 1
8799
+ 1
8800
+ 1
8801
+ 1
8802
+ 1
8803
+ 2
8804
+ 1
8805
+ 1
8806
+ 1
8807
+ 1
8808
+ 1
8809
+ 1
8810
+ 1
8811
+ 1
8812
+ 1
8813
+ 1
8814
+ 2
8815
+ 1
8816
+ 1
8817
+ 1
8818
+ 1
8819
+ 1
8820
+ 1
8821
+ 1
8822
+ 1
8823
+ 1
8824
+ 1
8825
+ 1
8826
+ 1
8827
+ 2
8828
+ 1
8829
+ 1
8830
+ 1
8831
+ 1
8832
+ 1
8833
+ 1
8834
+ 1
8835
+ 1
8836
+ 1
8837
+ 1
8838
+ 1
8839
+ 1
8840
+ 1
8841
+ 1
8842
+ 1
8843
+ 1
8844
+ 1
8845
+ 1
8846
+ 1
8847
+ 1
8848
+ 1
8849
+ 1
8850
+ 1
8851
+ 1
8852
+ 1
8853
+ 1
8854
+ 1
8855
+ 2
8856
+ 1
8857
+ 2
8858
+ 1
8859
+ 1
8860
+ 1
8861
+ 1
8862
+ 1
8863
+ 1
8864
+ 1
8865
+ 1
8866
+ 1
8867
+ 2
8868
+ 1
8869
+ 1
8870
+ 1
8871
+ 1
8872
+ 1
8873
+ 1
8874
+ 1
8875
+ 1
8876
+ 1
8877
+ 1
8878
+ 1
8879
+ 1
8880
+ 1
8881
+ 1
8882
+ 1
8883
+ 1
8884
+ 1
8885
+ 1
8886
+ 1
8887
+ 1
8888
+ 1
8889
+ 1
8890
+ 1
8891
+ 1
8892
+ 1
8893
+ 1
8894
+ 1
8895
+ 1
8896
+ 1
8897
+ 1
8898
+ 1
8899
+ 1
8900
+ 1
8901
+ 1
8902
+ 1
8903
+ 1
8904
+ 1
8905
+ 1
8906
+ 1
8907
+ 1
8908
+ 1
8909
+ 1
8910
+ 1
8911
+ 1
8912
+ 1
8913
+ 1
8914
+ 1
8915
+ 1
8916
+ 1
8917
+ 1
8918
+ 1
8919
+ 2
8920
+ 1
8921
+ 1
8922
+ 1
8923
+ 2
8924
+ 2
8925
+ 1
8926
+ 1
8927
+ 1
8928
+ 1
8929
+ 1
8930
+ 1
8931
+ 1
8932
+ 1
8933
+ 2
8934
+ 1
8935
+ 1
8936
+ 1
8937
+ 1
8938
+ 1
8939
+ 1
8940
+ 1
8941
+ 1
8942
+ 1
8943
+ 1
8944
+ 1
8945
+ 1
8946
+ 1
8947
+ 1
8948
+ 1
8949
+ 1
8950
+ 1
8951
+ 1
8952
+ 1
8953
+ 1
8954
+ 1
8955
+ 1
8956
+ 1
8957
+ 1
8958
+ 1
8959
+ 2
8960
+ 1
8961
+ 1
8962
+ 1
8963
+ 1
8964
+ 1
8965
+ 1
8966
+ 1
8967
+ 1
8968
+ 2
8969
+ 1
8970
+ 1
8971
+ 1
8972
+ 1
8973
+ 1
8974
+ 1
8975
+ 1
8976
+ 1
8977
+ 1
8978
+ 1
8979
+ 1
8980
+ 1
8981
+ 1
8982
+ 1
8983
+ 1
8984
+ 1
8985
+ 1
8986
+ 1
8987
+ 1
8988
+ 1
8989
+ 1
8990
+ 1
8991
+ 1
8992
+ 1
8993
+ 1
8994
+ 1
8995
+ 1
8996
+ 1
8997
+ 1
8998
+ 1
8999
+ 1
9000
+ 1
9001
+ 1
9002
+ 1
9003
+ 1
9004
+ 2
9005
+ 1
9006
+ 1
9007
+ 1
9008
+ 1
9009
+ 1
9010
+ 1
9011
+ 1
9012
+ 1
9013
+ 1
9014
+ 1
9015
+ 1
9016
+ 1
9017
+ 1
9018
+ 1
9019
+ 2
9020
+ 1
9021
+ 1
9022
+ 1
9023
+ 1
9024
+ 1
9025
+ 1
9026
+ 1
9027
+ 1
9028
+ 1
9029
+ 1
9030
+ 1
9031
+ 1
9032
+ 1
9033
+ 1
9034
+ 1
9035
+ 1
9036
+ 1
9037
+ 1
9038
+ 1
9039
+ 1
9040
+ 1
9041
+ 1
9042
+ 1
9043
+ 1
9044
+ 1
9045
+ 1
9046
+ 1
9047
+ 1
9048
+ 1
9049
+ 1
9050
+ 1
9051
+ 1
9052
+ 1
9053
+ 1
9054
+ 1
9055
+ 1
9056
+ 1
9057
+ 1
9058
+ 1
9059
+ 1
9060
+ 1
9061
+ 1
9062
+ 1
9063
+ 1
9064
+ 1
9065
+ 1
9066
+ 1
9067
+ 1
9068
+ 1
9069
+ 1
9070
+ 1
9071
+ 1
9072
+ 1
9073
+ 1
9074
+ 1
9075
+ 1
9076
+ 1
9077
+ 1
9078
+ 1
9079
+ 2
9080
+ 1
9081
+ 1
9082
+ 1
9083
+ 1
9084
+ 1
9085
+ 1
9086
+ 1
9087
+ 1
9088
+ 1
9089
+ 1
9090
+ 1
9091
+ 1
9092
+ 1
9093
+ 1
9094
+ 1
9095
+ 1
9096
+ 2
9097
+ 1
9098
+ 1
9099
+ 1
9100
+ 1
9101
+ 1
9102
+ 1
9103
+ 1
9104
+ 1
9105
+ 2
9106
+ 1
9107
+ 1
9108
+ 1
9109
+ 1
9110
+ 1
9111
+ 1
9112
+ 1
9113
+ 2
9114
+ 1
9115
+ 1
9116
+ 1
9117
+ 1
9118
+ 1
9119
+ 1
9120
+ 1
9121
+ 1
9122
+ 1
9123
+ 1
9124
+ 1
9125
+ 1
9126
+ 1
9127
+ 1
9128
+ 1
9129
+ 1
9130
+ 2
9131
+ 1
9132
+ 1
9133
+ 1
9134
+ 1
9135
+ 1
9136
+ 1
9137
+ 1
9138
+ 1
9139
+ 1
9140
+ 1
9141
+ 1
9142
+ 1
9143
+ 1
9144
+ 1
9145
+ 1
9146
+ 1
9147
+ 1
9148
+ 2
9149
+ 1
9150
+ 1
9151
+ 1
9152
+ 1
9153
+ 1
9154
+ 1
9155
+ 1
9156
+ 1
9157
+ 1
9158
+ 1
9159
+ 1
9160
+ 1
9161
+ 1
9162
+ 1
9163
+ 1
9164
+ 1
9165
+ 1
9166
+ 1
9167
+ 1
9168
+ 1
9169
+ 1
9170
+ 1
9171
+ 2
9172
+ 2
9173
+ 1
9174
+ 1
9175
+ 1
9176
+ 1
9177
+ 1
9178
+ 1
9179
+ 1
9180
+ 1
9181
+ 1
9182
+ 1
9183
+ 1
9184
+ 1
9185
+ 1
9186
+ 1
9187
+ 1
9188
+ 1
9189
+ 1
9190
+ 1
9191
+ 1
9192
+ 1
9193
+ 1
9194
+ 1
9195
+ 1
9196
+ 1
9197
+ 1
9198
+ 2
9199
+ 1
9200
+ 1
9201
+ 2
9202
+ 1
9203
+ 1
9204
+ 1
9205
+ 1
9206
+ 1
9207
+ 1
9208
+ 1
9209
+ 1
9210
+ 1
9211
+ 1
9212
+ 1
9213
+ 1
9214
+ 1
9215
+ 1
9216
+ 1
9217
+ 1
9218
+ 1
9219
+ 1
9220
+ 1
9221
+ 1
9222
+ 1
9223
+ 1
9224
+ 1
9225
+ 1
9226
+ 1
9227
+ 1
9228
+ 1
9229
+ 1
9230
+ 1
9231
+ 1
9232
+ 1
9233
+ 1
9234
+ 1
9235
+ 1
9236
+ 1
9237
+ 1
9238
+ 1
9239
+ 1
9240
+ 1
9241
+ 1
9242
+ 1
9243
+ 1
9244
+ 1
9245
+ 1
9246
+ 1
9247
+ 1
9248
+ 1
9249
+ 1
9250
+ 2
9251
+ 1
9252
+ 1
9253
+ 1
9254
+ 2
9255
+ 1
9256
+ 1
9257
+ 1
9258
+ 1
9259
+ 1
9260
+ 1
9261
+ 1
9262
+ 1
9263
+ 1
9264
+ 1
9265
+ 1
9266
+ 1
9267
+ 1
9268
+ 1
9269
+ 1
9270
+ 1
9271
+ 2
9272
+ 1
9273
+ 1
9274
+ 1
9275
+ 1
9276
+ 1
9277
+ 1
9278
+ 1
9279
+ 1
9280
+ 1
9281
+ 1
9282
+ 1
9283
+ 2
9284
+ 1
9285
+ 1
9286
+ 1
9287
+ 1
9288
+ 1
9289
+ 2
9290
+ 1
9291
+ 1
9292
+ 1
9293
+ 1
9294
+ 1
9295
+ 1
9296
+ 2
9297
+ 1
9298
+ 1
9299
+ 1
9300
+ 1
9301
+ 1
9302
+ 1
9303
+ 1
9304
+ 1
9305
+ 1
9306
+ 1
9307
+ 1
9308
+ 1
9309
+ 1
9310
+ 1
9311
+ 1
9312
+ 1
9313
+ 1
9314
+ 1
9315
+ 1
9316
+ 1
9317
+ 1
9318
+ 1
9319
+ 1
9320
+ 1
9321
+ 1
9322
+ 2
9323
+ 1
9324
+ 2
9325
+ 2
9326
+ 1
9327
+ 1
9328
+ 1
9329
+ 1
9330
+ 1
9331
+ 1
9332
+ 1
9333
+ 1
9334
+ 1
9335
+ 1
9336
+ 1
9337
+ 1
9338
+ 1
9339
+ 1
9340
+ 1
9341
+ 1
9342
+ 1
9343
+ 1
9344
+ 1
9345
+ 1
9346
+ 1
9347
+ 1
9348
+ 2
9349
+ 1
9350
+ 1
9351
+ 1
9352
+ 1
9353
+ 1
9354
+ 1
9355
+ 1
9356
+ 1
9357
+ 1
9358
+ 1
9359
+ 1
9360
+ 1
9361
+ 1
9362
+ 1
9363
+ 1
9364
+ 1
9365
+ 1
9366
+ 1
9367
+ 1
9368
+ 1
9369
+ 1
9370
+ 1
9371
+ 1
9372
+ 1
9373
+ 1
9374
+ 1
9375
+ 1
9376
+ 1
9377
+ 1
9378
+ 1
9379
+ 1
9380
+ 1
9381
+ 1
9382
+ 1
9383
+ 1
9384
+ 1
9385
+ 1
9386
+ 1
9387
+ 1
9388
+ 1
9389
+ 1
9390
+ 1
9391
+ 1
9392
+ 1
9393
+ 1
9394
+ 1
9395
+ 1
9396
+ 1
9397
+ 1
9398
+ 1
9399
+ 1
9400
+ 2
9401
+ 1
9402
+ 1
9403
+ 1
9404
+ 2
9405
+ 1
9406
+ 1
9407
+ 1
9408
+ 1
9409
+ 1
9410
+ 1
9411
+ 1
9412
+ 1
9413
+ 1
9414
+ 1
9415
+ 1
9416
+ 1
9417
+ 1
9418
+ 2
9419
+ 1
9420
+ 1
9421
+ 1
9422
+ 1
9423
+ 1
9424
+ 1
9425
+ 1
9426
+ 1
9427
+ 2
9428
+ 2
9429
+ 1
9430
+ 1
9431
+ 1
9432
+ 1
9433
+ 1
9434
+ 1
9435
+ 1
9436
+ 1
9437
+ 1
9438
+ 1
9439
+ 1
9440
+ 2
9441
+ 1
9442
+ 1
9443
+ 1
9444
+ 1
9445
+ 1
9446
+ 1
9447
+ 1
9448
+ 1
9449
+ 1
9450
+ 1
9451
+ 1
9452
+ 1
9453
+ 1
9454
+ 1
9455
+ 1
9456
+ 1
9457
+ 1
9458
+ 1
9459
+ 1
9460
+ 1
9461
+ 1
9462
+ 1
9463
+ 1
9464
+ 1
9465
+ 1
9466
+ 1
9467
+ 1
9468
+ 1
9469
+ 2
9470
+ 1
9471
+ 1
9472
+ 1
9473
+ 1
9474
+ 1
9475
+ 1
9476
+ 1
9477
+ 1
9478
+ 1
9479
+ 1
9480
+ 1
9481
+ 1
9482
+ 1
9483
+ 1
9484
+ 1
9485
+ 1
9486
+ 1
9487
+ 2
9488
+ 1
9489
+ 1
9490
+ 1
9491
+ 1
9492
+ 1
9493
+ 1
9494
+ 1
9495
+ 1
9496
+ 1
9497
+ 2
9498
+ 1
9499
+ 1
9500
+ 1
9501
+ 1
9502
+ 1
9503
+ 1
9504
+ 1
9505
+ 1
9506
+ 1
9507
+ 1
9508
+ 1
9509
+ 1
9510
+ 1
9511
+ 1
9512
+ 2
9513
+ 1
9514
+ 1
9515
+ 1
9516
+ 1
9517
+ 2
9518
+ 1
9519
+ 2
9520
+ 1
9521
+ 1
9522
+ 1
9523
+ 1
9524
+ 1
9525
+ 1
9526
+ 1
9527
+ 1
9528
+ 1
9529
+ 1
9530
+ 2
9531
+ 1
9532
+ 1
9533
+ 1
9534
+ 1
9535
+ 1
9536
+ 1
9537
+ 1
9538
+ 1
9539
+ 1
9540
+ 1
9541
+ 1
9542
+ 1
9543
+ 1
9544
+ 1
9545
+ 1
9546
+ 1
9547
+ 1
9548
+ 1
9549
+ 1
9550
+ 1
9551
+ 1
9552
+ 1
9553
+ 1
9554
+ 1
9555
+ 1
9556
+ 1
9557
+ 1
9558
+ 2
9559
+ 1
9560
+ 1
9561
+ 1
9562
+ 1
9563
+ 1
9564
+ 2
9565
+ 2
9566
+ 1
9567
+ 1
9568
+ 1
9569
+ 1
9570
+ 1
9571
+ 1
9572
+ 1
9573
+ 1
9574
+ 1
9575
+ 1
9576
+ 1
9577
+ 1
9578
+ 1
9579
+ 1
9580
+ 1
9581
+ 1
9582
+ 1
9583
+ 1
9584
+ 1
9585
+ 2
9586
+ 1
9587
+ 2
9588
+ 1
9589
+ 1
9590
+ 1
9591
+ 1
9592
+ 2
9593
+ 1
9594
+ 1
9595
+ 1
9596
+ 1
9597
+ 1
9598
+ 1
9599
+ 1
9600
+ 2
9601
+ 2
9602
+ 2
9603
+ 1
9604
+ 1
9605
+ 1
9606
+ 1
9607
+ 1
9608
+ 1
9609
+ 1
9610
+ 1
9611
+ 1
9612
+ 1
9613
+ 1
9614
+ 1
9615
+ 1
9616
+ 1
9617
+ 1
9618
+ 1
9619
+ 1
9620
+ 1
9621
+ 1
9622
+ 1
9623
+ 1
9624
+ 1
9625
+ 1
9626
+ 1
9627
+ 1
9628
+ 1
9629
+ 1
9630
+ 1
9631
+ 1
9632
+ 1
9633
+ 2
9634
+ 1
9635
+ 1
9636
+ 1
9637
+ 1
9638
+ 1
9639
+ 1
9640
+ 1
9641
+ 1
9642
+ 1
9643
+ 1
9644
+ 1
9645
+ 1
9646
+ 1
9647
+ 1
9648
+ 1
9649
+ 1
9650
+ 1
9651
+ 1
9652
+ 1
9653
+ 1
9654
+ 1
9655
+ 2
9656
+ 1
9657
+ 1
9658
+ 1
9659
+ 1
9660
+ 1
9661
+ 1
9662
+ 1
9663
+ 1
9664
+ 1
9665
+ 1
9666
+ 1
9667
+ 1
9668
+ 2
9669
+ 1
9670
+ 1
9671
+ 1
9672
+ 1
9673
+ 1
9674
+ 1
9675
+ 1
9676
+ 1
9677
+ 1
9678
+ 1
9679
+ 2
9680
+ 1
9681
+ 1
9682
+ 1
9683
+ 1
9684
+ 1
9685
+ 1
9686
+ 1
9687
+ 1
9688
+ 1
9689
+ 1
9690
+ 1
9691
+ 1
9692
+ 1
9693
+ 1
9694
+ 1
9695
+ 1
9696
+ 1
9697
+ 2
9698
+ 1
9699
+ 1
9700
+ 1
9701
+ 1
9702
+ 1
9703
+ 1
9704
+ 1
9705
+ 1
9706
+ 1
9707
+ 1
9708
+ 1
9709
+ 1
9710
+ 1
9711
+ 1
9712
+ 1
9713
+ 1
9714
+ 1
9715
+ 1
9716
+ 1
9717
+ 2
9718
+ 1
9719
+ 1
9720
+ 1
9721
+ 1
9722
+ 1
9723
+ 1
9724
+ 2
9725
+ 1
9726
+ 1
9727
+ 1
9728
+ 1
9729
+ 1
9730
+ 1
9731
+ 1
9732
+ 1
9733
+ 1
9734
+ 1
9735
+ 1
9736
+ 1
9737
+ 1
9738
+ 1
9739
+ 1
9740
+ 1
9741
+ 2
9742
+ 1
9743
+ 1
9744
+ 1
9745
+ 1
9746
+ 1
9747
+ 1
9748
+ 1
9749
+ 1
9750
+ 1
9751
+ 1
9752
+ 1
9753
+ 1
9754
+ 1
9755
+ 1
9756
+ 1
9757
+ 1
9758
+ 1
9759
+ 1
9760
+ 1
9761
+ 1
9762
+ 1
9763
+ 1
9764
+ 1
9765
+ 1
9766
+ 1
9767
+ 1
9768
+ 1
9769
+ 1
9770
+ 1
9771
+ 1
9772
+ 1
9773
+ 1
9774
+ 1
9775
+ 1
9776
+ 1
9777
+ 1
9778
+ 1
9779
+ 1
9780
+ 1
9781
+ 1
9782
+ 1
9783
+ 1
9784
+ 1
9785
+ 1
9786
+ 1
9787
+ 1
9788
+ 1
9789
+ 1
9790
+ 1
9791
+ 1
9792
+ 1
9793
+ 1
9794
+ 1
9795
+ 1
9796
+ 1
9797
+ 1
9798
+ 1
9799
+ 1
9800
+ 1
9801
+ 1
9802
+ 1
9803
+ 1
9804
+ 1
9805
+ 1
9806
+ 1
9807
+ 1
9808
+ 1
9809
+ 1
9810
+ 1
9811
+ 1
9812
+ 1
9813
+ 1
9814
+ 1
9815
+ 1
9816
+ 1
9817
+ 1
9818
+ 1
9819
+ 1
9820
+ 1
9821
+ 2
9822
+ 1
9823
+ 1
9824
+ 1
9825
+ 2
9826
+ 2
9827
+ 1
9828
+ 1
9829
+ 2
9830
+ 1
9831
+ 1
9832
+ 1
9833
+ 1
9834
+ 1
9835
+ 1
9836
+ 1
9837
+ 1
9838
+ 1
9839
+ 1
9840
+ 1
9841
+ 1
9842
+ 1
9843
+ 1
9844
+ 1
9845
+ 1
9846
+ 1
9847
+ 1
9848
+ 1
9849
+ 1
9850
+ 1
9851
+ 1
9852
+ 1
9853
+ 1
9854
+ 1
9855
+ 1
9856
+ 1
9857
+ 1
9858
+ 1
9859
+ 1
9860
+ 1
9861
+ 1
9862
+ 1
9863
+ 1
9864
+ 2
9865
+ 1
9866
+ 1
9867
+ 2
9868
+ 1
9869
+ 2
9870
+ 1
9871
+ 1
9872
+ 1
9873
+ 1
9874
+ 1
9875
+ 1
9876
+ 1
9877
+ 1
9878
+ 1
9879
+ 1
9880
+ 1
9881
+ 1
9882
+ 1
9883
+ 1
9884
+ 1
9885
+ 1
9886
+ 1
9887
+ 1
9888
+ 1
9889
+ 1
9890
+ 2
9891
+ 1
9892
+ 1
9893
+ 1
9894
+ 1
9895
+ 1
9896
+ 1
9897
+ 1
9898
+ 1
9899
+ 1
9900
+ 1
9901
+ 1
9902
+ 1
9903
+ 1
9904
+ 1
9905
+ 1
9906
+ 1
9907
+ 1
9908
+ 1
9909
+ 1
9910
+ 1
9911
+ 1
9912
+ 1
9913
+ 1
9914
+ 1
9915
+ 1
9916
+ 1
9917
+ 1
9918
+ 1
9919
+ 1
9920
+ 1
9921
+ 1
9922
+ 1
9923
+ 1
9924
+ 1
9925
+ 1
9926
+ 1
9927
+ 1
9928
+ 1
9929
+ 1
9930
+ 2
9931
+ 1
9932
+ 1
9933
+ 1
9934
+ 1
9935
+ 1
9936
+ 1
9937
+ 1
9938
+ 1
9939
+ 2
9940
+ 1
9941
+ 1
9942
+ 1
9943
+ 1
9944
+ 1
9945
+ 1
9946
+ 1
9947
+ 1
9948
+ 1
9949
+ 1
9950
+ 1
9951
+ 1
9952
+ 1
9953
+ 1
9954
+ 2
9955
+ 1
9956
+ 1
9957
+ 1
9958
+ 1
9959
+ 1
9960
+ 1
9961
+ 1
9962
+ 1
9963
+ 1
9964
+ 1
9965
+ 1
9966
+ 1
9967
+ 1
9968
+ 2
9969
+ 1
9970
+ 1
9971
+ 1
9972
+ 1
9973
+ 1
9974
+ 1
9975
+ 1
9976
+ 1
9977
+ 1
9978
+ 1
9979
+ 1
9980
+ 1
9981
+ 1
9982
+ 1
9983
+ 1
9984
+ 1
9985
+ 1
9986
+ 1
9987
+ 1
9988
+ 1
9989
+ 1
9990
+ 1
9991
+ 1
9992
+ 1
9993
+ 1
9994
+ 1
9995
+ 1
9996
+ 1
9997
+ 1
9998
+ 1
9999
+ 1
10000
+ 1
10001
+ 1
10002
+ 1
10003
+ 1
10004
+ 1
10005
+ 1
10006
+ 1
10007
+ 1
10008
+ 1
10009
+ 1
10010
+ 1
10011
+ 1
10012
+ 1
10013
+ 1
10014
+ 1
10015
+ 1
10016
+ 1
10017
+ 1
10018
+ 1
10019
+ 1
10020
+ 2
10021
+ 2
10022
+ 1
10023
+ 1
10024
+ 1
10025
+ 1
10026
+ 2
10027
+ 1
10028
+ 1
10029
+ 1
10030
+ 1
10031
+ 1
10032
+ 1
10033
+ 1
10034
+ 1
10035
+ 1
10036
+ 1
10037
+ 1
10038
+ 1
10039
+ 1
10040
+ 1
10041
+ 1
10042
+ 1
10043
+ 1
10044
+ 1
10045
+ 1
10046
+ 1
10047
+ 1
10048
+ 1
10049
+ 1
10050
+ 1
10051
+ 1
10052
+ 1
10053
+ 1
10054
+ 1
10055
+ 1
10056
+ 1
10057
+ 1
10058
+ 1
10059
+ 1
10060
+ 2
10061
+ 1
10062
+ 1
10063
+ 1
10064
+ 1
10065
+ 1
10066
+ 1
10067
+ 1
10068
+ 1
10069
+ 1
10070
+ 1
10071
+ 1
10072
+ 1
10073
+ 1
10074
+ 1
10075
+ 1
10076
+ 1
10077
+ 1
10078
+ 1
10079
+ 1
10080
+ 1
10081
+ 1
10082
+ 1
10083
+ 1
10084
+ 1
10085
+ 1
10086
+ 1
10087
+ 1
10088
+ 1
10089
+ 1
10090
+ 1
10091
+ 1
10092
+ 1
10093
+ 1
10094
+ 1
10095
+ 1
10096
+ 1
10097
+ 1
10098
+ 1
10099
+ 1
10100
+ 1
10101
+ 1
10102
+ 1
10103
+ 1
10104
+ 1
10105
+ 1
10106
+ 1
10107
+ 1
10108
+ 1
10109
+ 1
10110
+ 1
10111
+ 1
10112
+ 2
10113
+ 1
10114
+ 1
10115
+ 1
10116
+ 1
10117
+ 1
10118
+ 1
10119
+ 2
10120
+ 1
10121
+ 1
10122
+ 1
10123
+ 1
10124
+ 1
10125
+ 1
10126
+ 2
10127
+ 1
10128
+ 1
10129
+ 1
10130
+ 1
10131
+ 1
10132
+ 1
10133
+ 1
10134
+ 1
10135
+ 1
10136
+ 1
10137
+ 1
10138
+ 1
10139
+ 1
10140
+ 1
10141
+ 1
10142
+ 1
10143
+ 1
10144
+ 1
10145
+ 1
10146
+ 1
10147
+ 1
10148
+ 1
10149
+ 1
10150
+ 1
10151
+ 1
10152
+ 1
10153
+ 1
10154
+ 1
10155
+ 1
10156
+ 1
10157
+ 1
10158
+ 1
10159
+ 1
10160
+ 1
10161
+ 1
10162
+ 1
10163
+ 1
10164
+ 1
10165
+ 1
10166
+ 1
10167
+ 1
10168
+ 1
10169
+ 1
10170
+ 1
10171
+ 1
10172
+ 1
10173
+ 1
10174
+ 1
10175
+ 2
10176
+ 1
10177
+ 1
10178
+ 1
10179
+ 1
10180
+ 1
10181
+ 1
10182
+ 1
10183
+ 1
10184
+ 1
10185
+ 1
10186
+ 1
10187
+ 1
10188
+ 1
10189
+ 1
10190
+ 1
10191
+ 1
10192
+ 1
10193
+ 1
10194
+ 1
10195
+ 2
10196
+ 1
10197
+ 1
10198
+ 1
10199
+ 1
10200
+ 1
10201
+ 1
10202
+ 2
10203
+ 2
10204
+ 1
10205
+ 1
10206
+ 1
10207
+ 1
10208
+ 1
10209
+ 1
10210
+ 1
10211
+ 1
10212
+ 1
10213
+ 1
10214
+ 1
10215
+ 1
10216
+ 1
10217
+ 1
10218
+ 1
10219
+ 1
10220
+ 1
10221
+ 2
10222
+ 2
10223
+ 1
10224
+ 1
10225
+ 1
10226
+ 1
10227
+ 2
10228
+ 1
10229
+ 1
10230
+ 1
10231
+ 1
10232
+ 1
10233
+ 1
10234
+ 1
10235
+ 1
10236
+ 1
10237
+ 1
10238
+ 1
10239
+ 1
10240
+ 1
10241
+ 1
10242
+ 1
10243
+ 2
10244
+ 1
10245
+ 1
10246
+ 1
10247
+ 1
10248
+ 1
10249
+ 1
10250
+ 1
10251
+ 2
10252
+ 1
10253
+ 1
10254
+ 1
10255
+ 1
10256
+ 1
10257
+ 1
10258
+ 1
10259
+ 1
10260
+ 1
10261
+ 1
10262
+ 1
10263
+ 1
10264
+ 1
10265
+ 1
10266
+ 1
10267
+ 1
10268
+ 1
10269
+ 1
10270
+ 1
10271
+ 1
10272
+ 1
10273
+ 1
10274
+ 1
10275
+ 1
10276
+ 1
10277
+ 2
10278
+ 1
10279
+ 1
10280
+ 1
10281
+ 1
10282
+ 1
10283
+ 1
10284
+ 1
10285
+ 1
10286
+ 1
10287
+ 1
10288
+ 1
10289
+ 1
10290
+ 1
10291
+ 1
10292
+ 1
10293
+ 1
10294
+ 1
10295
+ 1
10296
+ 2
10297
+ 1
10298
+ 1
10299
+ 1
10300
+ 1
10301
+ 1
10302
+ 1
10303
+ 2
10304
+ 1
10305
+ 1
10306
+ 2
10307
+ 1
10308
+ 1
10309
+ 1
10310
+ 1
10311
+ 1
10312
+ 1
10313
+ 1
10314
+ 1
10315
+ 1
10316
+ 1
10317
+ 1
10318
+ 1
10319
+ 1
10320
+ 1
10321
+ 1
10322
+ 1
10323
+ 1
10324
+ 1
10325
+ 1
10326
+ 1
10327
+ 1
10328
+ 2
10329
+ 1
10330
+ 1
10331
+ 1
10332
+ 1
10333
+ 1
10334
+ 1
10335
+ 1
10336
+ 1
10337
+ 1
10338
+ 1
10339
+ 1
10340
+ 1
10341
+ 1
10342
+ 1
10343
+ 1
10344
+ 1
10345
+ 1
10346
+ 1
10347
+ 1
10348
+ 1
10349
+ 1
10350
+ 1
10351
+ 1
10352
+ 2
10353
+ 1
10354
+ 1
10355
+ 1
10356
+ 1
10357
+ 1
10358
+ 1
10359
+ 1
10360
+ 1
10361
+ 2
10362
+ 1
10363
+ 1
10364
+ 1
10365
+ 1
10366
+ 1
10367
+ 1
10368
+ 1
10369
+ 1
10370
+ 2
10371
+ 1
10372
+ 1
10373
+ 1
10374
+ 1
10375
+ 1
10376
+ 1
10377
+ 1
10378
+ 1
10379
+ 1
10380
+ 1
10381
+ 1
10382
+ 1
10383
+ 1
10384
+ 1
10385
+ 1
10386
+ 1
10387
+ 1
10388
+ 1
10389
+ 1
10390
+ 1
10391
+ 1
10392
+ 1
10393
+ 1
10394
+ 2
10395
+ 1
10396
+ 1
10397
+ 1
10398
+ 1
10399
+ 1
10400
+ 1
10401
+ 1
10402
+ 1
10403
+ 1
10404
+ 1
10405
+ 1
10406
+ 1
10407
+ 1
10408
+ 2
10409
+ 1
10410
+ 1
10411
+ 1
10412
+ 1
10413
+ 1
10414
+ 1
10415
+ 1
10416
+ 1
10417
+ 1
10418
+ 1
10419
+ 1
10420
+ 1
10421
+ 1
10422
+ 1
10423
+ 1
10424
+ 1
10425
+ 1
10426
+ 1
10427
+ 1
10428
+ 1
10429
+ 1
10430
+ 1
10431
+ 1
10432
+ 1
10433
+ 1
10434
+ 1
10435
+ 1
10436
+ 1
10437
+ 1
10438
+ 1
10439
+ 2
10440
+ 1
10441
+ 1
10442
+ 1
10443
+ 1
10444
+ 1
10445
+ 1
10446
+ 1
10447
+ 1
10448
+ 1
10449
+ 1
10450
+ 1
10451
+ 1
10452
+ 1
10453
+ 1
10454
+ 1
10455
+ 1
10456
+ 2
10457
+ 1
10458
+ 1
10459
+ 1
10460
+ 1
10461
+ 1
10462
+ 1
10463
+ 1
10464
+ 2
10465
+ 1
10466
+ 2
10467
+ 1
10468
+ 1
10469
+ 1
10470
+ 1
10471
+ 2
10472
+ 1
10473
+ 1
10474
+ 1
10475
+ 1
10476
+ 1
10477
+ 1
10478
+ 1
10479
+ 2
10480
+ 1
10481
+ 1
10482
+ 1
10483
+ 1
10484
+ 1
10485
+ 1
10486
+ 1
10487
+ 1
10488
+ 1
10489
+ 1
10490
+ 1
10491
+ 1
10492
+ 1
10493
+ 1
10494
+ 1
10495
+ 1
10496
+ 1
10497
+ 1
10498
+ 1
10499
+ 1
10500
+ 1
10501
+ 1
10502
+ 1
10503
+ 1
10504
+ 2
10505
+ 1
10506
+ 1
10507
+ 1
10508
+ 1
10509
+ 2
10510
+ 2
10511
+ 1
10512
+ 1
10513
+ 1
10514
+ 1
10515
+ 1
10516
+ 1
10517
+ 1
10518
+ 1
10519
+ 1
10520
+ 1
10521
+ 1
10522
+ 1
10523
+ 1
10524
+ 1
10525
+ 1
10526
+ 1
10527
+ 1
10528
+ 1
10529
+ 1
10530
+ 1
10531
+ 1
10532
+ 1
10533
+ 1
10534
+ 1
10535
+ 1
10536
+ 1
10537
+ 1
10538
+ 1
10539
+ 1
10540
+ 1
10541
+ 1
10542
+ 1
10543
+ 1
10544
+ 1
10545
+ 1
10546
+ 1
10547
+ 1
10548
+ 1
10549
+ 1
10550
+ 1
10551
+ 1
10552
+ 1
10553
+ 1
10554
+ 1
10555
+ 1
10556
+ 1
10557
+ 1
10558
+ 1
10559
+ 1
10560
+ 1
10561
+ 1
10562
+ 1
10563
+ 1
10564
+ 1
10565
+ 1
10566
+ 1
10567
+ 1
10568
+ 1
10569
+ 1
10570
+ 1
10571
+ 1
10572
+ 1
10573
+ 1
10574
+ 1
10575
+ 1
10576
+ 1
10577
+ 1
10578
+ 1
10579
+ 1
10580
+ 1
10581
+ 1
10582
+ 1
10583
+ 1
10584
+ 1
10585
+ 1
10586
+ 1
10587
+ 1
10588
+ 1
10589
+ 1
10590
+ 1
10591
+ 1
10592
+ 1
10593
+ 1
10594
+ 1
10595
+ 1
10596
+ 1
10597
+ 1
10598
+ 1
10599
+ 1
10600
+ 1
10601
+ 1
10602
+ 1
10603
+ 1
10604
+ 1
10605
+ 1
10606
+ 1
10607
+ 1
10608
+ 1
10609
+ 1
10610
+ 1
10611
+ 1
10612
+ 1
10613
+ 1
10614
+ 1
10615
+ 1
10616
+ 1
10617
+ 1
10618
+ 1
10619
+ 1
10620
+ 1
10621
+ 1
10622
+ 1
10623
+ 1
10624
+ 1
10625
+ 1
10626
+ 1
10627
+ 1
10628
+ 1
10629
+ 1
10630
+ 1
10631
+ 1
10632
+ 1
10633
+ 1
10634
+ 1
10635
+ 1
10636
+ 1
10637
+ 1
10638
+ 1
10639
+ 1
10640
+ 1
10641
+ 1
10642
+ 1
10643
+ 1
10644
+ 1
10645
+ 1
10646
+ 1
10647
+ 1
10648
+ 1
10649
+ 1
10650
+ 1
10651
+ 1
10652
+ 1
10653
+ 1
10654
+ 1
10655
+ 1
10656
+ 1
10657
+ 1
10658
+ 1
10659
+ 1
10660
+ 1
10661
+ 1
10662
+ 1
10663
+ 1
10664
+ 1
10665
+ 1
10666
+ 1
10667
+ 1
10668
+ 1
10669
+ 1
10670
+ 1
10671
+ 1
10672
+ 1
10673
+ 1
10674
+ 1
10675
+ 1
10676
+ 1
10677
+ 1
10678
+ 1
10679
+ 1
10680
+ 1
10681
+ 1
10682
+ 1
10683
+ 1
10684
+ 1
10685
+ 1
10686
+ 1
10687
+ 1
10688
+ 1
10689
+ 1
10690
+ 1
10691
+ 1
10692
+ 1
10693
+ 1
10694
+ 1
10695
+ 1
10696
+ 1
10697
+ 1
10698
+ 1
10699
+ 1
10700
+ 1
10701
+ 1
10702
+ 1
10703
+ 1
10704
+ 1
10705
+ 1
10706
+ 1
10707
+ 1
10708
+ 1
10709
+ 1
10710
+ 1
10711
+ 1
10712
+ 1
10713
+ 1
10714
+ 1
10715
+ 1
10716
+ 1
10717
+ 1
10718
+ 1
10719
+ 1
10720
+ 1
10721
+ 1
10722
+ 1
10723
+ 1
10724
+ 1
10725
+ 1
10726
+ 1
10727
+ 1
10728
+ 1
10729
+ 1
10730
+ 1
10731
+ 1
10732
+ 1
10733
+ 1
10734
+ 1
10735
+ 1
10736
+ 1
10737
+ 1
10738
+ 1
10739
+ 1
10740
+ 1
10741
+ 1
10742
+ 1
10743
+ 1
10744
+ 1
10745
+ 1
10746
+ 1
10747
+ 1
10748
+ 1
10749
+ 1
10750
+ 1
10751
+ 1
10752
+ 1
10753
+ 1
10754
+ 1
10755
+ 1
10756
+ 1
10757
+ 1
10758
+ 1
10759
+ 1
10760
+ 1
10761
+ 1
10762
+ 1
10763
+ 1
10764
+ 1
10765
+ 1
10766
+ 1
10767
+ 1
10768
+ 1
10769
+ 1
10770
+ 1
10771
+ 1
10772
+ 1
10773
+ 1
10774
+ 1
10775
+ 1
10776
+ 1
10777
+ 1
10778
+ 1
10779
+ 1
10780
+ 1
10781
+ 1
10782
+ 1
10783
+ 1
10784
+ 1
10785
+ 1
10786
+ 1
10787
+ 1
10788
+ 1
10789
+ 1
10790
+ 1
10791
+ 1
10792
+ 1
10793
+ 1
10794
+ 1
10795
+ 1
10796
+ 1
10797
+ 1
10798
+ 1
10799
+ 1
10800
+ 1
10801
+ 1
10802
+ 1
10803
+ 1
10804
+ 1
10805
+ 1
10806
+ 1
10807
+ 1
10808
+ 1
10809
+ 1
10810
+ 2
10811
+ 1
10812
+ 1
10813
+ 1
10814
+ 1
10815
+ 1
10816
+ 1
10817
+ 1
10818
+ 1
10819
+ 1
10820
+ 1
10821
+ 1
10822
+ 1
10823
+ 1
10824
+ 1
10825
+ 1
10826
+ 1
10827
+ 1
10828
+ 1
10829
+ 1
10830
+ 1
10831
+ 1
10832
+ 1
10833
+ 1
10834
+ 1
10835
+ 1
10836
+ 1
10837
+ 1
10838
+ 1
10839
+ 1
10840
+ 1
10841
+ 1
10842
+ 1
10843
+ 1
10844
+ 1
10845
+ 1
10846
+ 1
10847
+ 1
10848
+ 1
10849
+ 1
10850
+ 1
10851
+ 1
10852
+ 1
10853
+ 1
10854
+ 1
10855
+ 1
10856
+ 1
10857
+ 1
10858
+ 1
10859
+ 1
10860
+ 1
10861
+ 1
10862
+ 1
10863
+ 1
10864
+ 1
10865
+ 1
10866
+ 1
10867
+ 1
10868
+ 1
10869
+ 1
10870
+ 1
10871
+ 1
10872
+ 1
10873
+ 1
10874
+ 1
10875
+ 1
10876
+ 1
10877
+ 1
10878
+ 1
10879
+ 1
10880
+ 1
10881
+ 1
10882
+ 1
10883
+ 1
10884
+ 1
10885
+ 1
10886
+ 1
10887
+ 1
10888
+ 1
10889
+ 1
10890
+ 1
10891
+ 1
10892
+ 1
10893
+ 1
10894
+ 1
10895
+ 1
10896
+ 1
10897
+ 1
10898
+ 1
10899
+ 1
10900
+ 1
10901
+ 1
10902
+ 1
10903
+ 1
10904
+ 1
10905
+ 1
10906
+ 1
10907
+ 1
10908
+ 1
10909
+ 1
10910
+ 1
10911
+ 1
10912
+ 1
10913
+ 1
10914
+ 1
10915
+ 1
10916
+ 1
10917
+ 1
10918
+ 1
10919
+ 1
10920
+ 1
10921
+ 1
10922
+ 1
10923
+ 1
10924
+ 1
10925
+ 1
10926
+ 1
10927
+ 1
10928
+ 1
10929
+ 1
10930
+ 1
10931
+ 1
10932
+ 1
10933
+ 1
10934
+ 1
10935
+ 1
10936
+ 1
10937
+ 1
10938
+ 1
10939
+ 1
10940
+ 1
10941
+ 1
10942
+ 1
10943
+ 1
10944
+ 1
10945
+ 1
10946
+ 1
10947
+ 1
10948
+ 1
10949
+ 1
10950
+ 1
10951
+ 1
10952
+ 1
10953
+ 1
10954
+ 1
10955
+ 1
10956
+ 1
10957
+ 1
10958
+ 1
10959
+ 1
10960
+ 1
10961
+ 1
10962
+ 1
10963
+ 1
10964
+ 1
10965
+ 1
10966
+ 1
10967
+ 1
10968
+ 1
10969
+ 1
10970
+ 1
10971
+ 1
10972
+ 1
10973
+ 1
10974
+ 1
10975
+ 1
10976
+ 1
10977
+ 1
10978
+ 1
10979
+ 1
10980
+ 1
10981
+ 1
10982
+ 1
10983
+ 1
10984
+ 1
10985
+ 1
10986
+ 1
10987
+ 1
10988
+ 1
10989
+ 1
10990
+ 1
10991
+ 1
10992
+ 1
10993
+ 1
10994
+ 1
10995
+ 1
10996
+ 1
10997
+ 1
10998
+ 1
10999
+ 1
11000
+ 1
11001
+ 1
11002
+ 1
11003
+ 1
11004
+ 1
11005
+ 1
11006
+ 1
11007
+ 1
11008
+ 1
11009
+ 1
11010
+ 1
11011
+ 1
11012
+ 1
11013
+ 1
11014
+ 1
11015
+ 1
11016
+ 1
11017
+ 1
11018
+ 1
11019
+ 1
11020
+ 1
11021
+ 1
11022
+ 1
11023
+ 1
11024
+ 1
11025
+ 1
11026
+ 1
11027
+ 1
11028
+ 1
11029
+ 1
11030
+ 1
11031
+ 1
11032
+ 1
11033
+ 1
11034
+ 1
11035
+ 1
11036
+ 1
11037
+ 1
11038
+ 1
11039
+ 1
11040
+ 1
11041
+ 1
11042
+ 1
11043
+ 1
11044
+ 1
11045
+ 1
11046
+ 1
11047
+ 1
11048
+ 1
11049
+ 1
11050
+ 1
11051
+ 1
11052
+ 1
11053
+ 1
11054
+ 1
11055
+ 1
11056
+ 1
11057
+ 1
11058
+ 1
11059
+ 1
11060
+ 1
11061
+ 1
11062
+ 1
11063
+ 1
11064
+ 1
11065
+ 1
11066
+ 1
11067
+ 1
11068
+ 1
11069
+ 1
11070
+ 1
11071
+ 1
11072
+ 1
11073
+ 1
11074
+ 1
11075
+ 1
11076
+ 1
11077
+ 1
11078
+ 1
11079
+ 1
11080
+ 1
11081
+ 2
11082
+ 1
11083
+ 1
11084
+ 1
11085
+ 1
11086
+ 1
11087
+ 1
11088
+ 1
11089
+ 1
11090
+ 1
11091
+ 1
11092
+ 1
11093
+ 1
11094
+ 1
11095
+ 1
11096
+ 1
11097
+ 1
11098
+ 1
11099
+ 1
11100
+ 1
11101
+ 1
11102
+ 1
11103
+ 1
11104
+ 1
11105
+ 1
11106
+ 1
11107
+ 1
11108
+ 1
11109
+ 1
11110
+ 1
11111
+ 1
11112
+ 1
11113
+ 1
11114
+ 1
11115
+ 1
11116
+ 1
11117
+ 1
11118
+ 1
11119
+ 1
11120
+ 1
11121
+ 1
11122
+ 1
11123
+ 1
11124
+ 1
11125
+ 1
11126
+ 1
11127
+ 1
11128
+ 1
11129
+ 1
11130
+ 1
11131
+ 1
11132
+ 1
11133
+ 1
11134
+ 1
11135
+ 1
11136
+ 1
11137
+ 1
11138
+ 1
11139
+ 1
11140
+ 1
11141
+ 1
11142
+ 1
11143
+ 1
11144
+ 1
11145
+ 1
11146
+ 1
11147
+ 1
11148
+ 1
11149
+ 1
11150
+ 1
11151
+ 1
11152
+ 1
11153
+ 1
11154
+ 1
11155
+ 1
11156
+ 1
11157
+ 1
11158
+ 1
11159
+ 1
11160
+ 1
11161
+ 1
11162
+ 1
11163
+ 1
11164
+ 1
11165
+ 1
11166
+ 1
11167
+ 1
11168
+ 1
11169
+ 1
11170
+ 1
11171
+ 1
11172
+ 1
11173
+ 1
11174
+ 1
11175
+ 1
11176
+ 1
11177
+ 1
11178
+ 1
11179
+ 1
11180
+ 1
11181
+ 1
11182
+ 1
11183
+ 1
11184
+ 1
11185
+ 1
11186
+ 1
11187
+ 1
11188
+ 1
11189
+ 1
11190
+ 1
11191
+ 1
11192
+ 1
11193
+ 1
11194
+ 1
11195
+ 1
11196
+ 1
11197
+ 1
11198
+ 1
11199
+ 1
11200
+ 1
11201
+ 1
11202
+ 1
11203
+ 1
11204
+ 1
11205
+ 1
11206
+ 1
11207
+ 1
11208
+ 1
11209
+ 1
11210
+ 1
11211
+ 1
11212
+ 1
11213
+ 1
11214
+ 1
11215
+ 1
11216
+ 1
11217
+ 1
11218
+ 1
11219
+ 1
11220
+ 1
11221
+ 1
11222
+ 1
11223
+ 1
11224
+ 1
11225
+ 1
11226
+ 1
11227
+ 1
11228
+ 1
11229
+ 1
11230
+ 1
11231
+ 1
11232
+ 1
11233
+ 1
11234
+ 1
11235
+ 1
11236
+ 1
11237
+ 1
11238
+ 1
11239
+ 1
11240
+ 1
11241
+ 1
11242
+ 1
11243
+ 1
11244
+ 1
11245
+ 1
11246
+ 1
11247
+ 1
11248
+ 1
11249
+ 1
11250
+ 1
11251
+ 1
11252
+ 1
11253
+ 1
11254
+ 1
11255
+ 1
11256
+ 1
11257
+ 1
11258
+ 1
11259
+ 1
11260
+ 1
11261
+ 1
11262
+ 1
11263
+ 1
11264
+ 1
11265
+ 1
11266
+ 1
11267
+ 1
11268
+ 1
11269
+ 1
11270
+ 1
11271
+ 1
11272
+ 1
11273
+ 1
11274
+ 1
11275
+ 1
11276
+ 1
11277
+ 1
11278
+ 1
11279
+ 1
11280
+ 1
11281
+ 1
11282
+ 1
11283
+ 1
11284
+ 1
11285
+ 1
11286
+ 1
11287
+ 1
11288
+ 1
11289
+ 1
11290
+ 1
11291
+ 1
11292
+ 1
11293
+ 1
11294
+ 1
11295
+ 1
11296
+ 1
11297
+ 1
11298
+ 1
11299
+ 1
11300
+ 1
11301
+ 1
11302
+ 1
11303
+ 1
11304
+ 1
11305
+ 1
11306
+ 1
11307
+ 1
11308
+ 1
11309
+ 1
11310
+ 1
11311
+ 1
11312
+ 1
11313
+ 1
11314
+ 1
11315
+ 1
11316
+ 1
11317
+ 1
11318
+ 1
11319
+ 1
11320
+ 1
11321
+ 1
11322
+ 1
11323
+ 1
11324
+ 1
11325
+ 1
11326
+ 1
11327
+ 1
11328
+ 1
11329
+ 1
11330
+ 1
11331
+ 1
11332
+ 2
11333
+ 1
11334
+ 1
11335
+ 1
11336
+ 1
11337
+ 1
11338
+ 1
11339
+ 1
11340
+ 1
11341
+ 1
11342
+ 1
11343
+ 1
11344
+ 1
11345
+ 1
11346
+ 1
11347
+ 1
11348
+ 1
11349
+ 1
11350
+ 1
11351
+ 1
11352
+ 1
11353
+ 1
11354
+ 1
11355
+ 1
11356
+ 1
11357
+ 1
11358
+ 1
11359
+ 1
11360
+ 1
11361
+ 1
11362
+ 1
11363
+ 1
11364
+ 1
11365
+ 1
11366
+ 1
11367
+ 1
11368
+ 1
11369
+ 1
11370
+ 1
11371
+ 1
11372
+ 1
11373
+ 1
11374
+ 1
11375
+ 1
11376
+ 1
11377
+ 1
11378
+ 1
11379
+ 1
11380
+ 1
11381
+ 1
11382
+ 1
11383
+ 1
11384
+ 1
11385
+ 1
11386
+ 1
11387
+ 1
11388
+ 1
11389
+ 1
11390
+ 1
11391
+ 1
11392
+ 1
11393
+ 1
11394
+ 1
11395
+ 1
11396
+ 1
11397
+ 1
11398
+ 1
11399
+ 1
11400
+ 1
11401
+ 1
11402
+ 1
11403
+ 1
11404
+ 1
11405
+ 1
11406
+ 1
11407
+ 1
11408
+ 1
11409
+ 1
11410
+ 1
11411
+ 1
11412
+ 1
11413
+ 1
11414
+ 1
11415
+ 1
11416
+ 1
11417
+ 1
11418
+ 1
11419
+ 1
11420
+ 1
11421
+ 1
11422
+ 1
11423
+ 1
11424
+ 1
11425
+ 1
11426
+ 1
11427
+ 1
11428
+ 1
11429
+ 1
11430
+ 1
11431
+ 1
11432
+ 1
11433
+ 1
11434
+ 1
11435
+ 1
11436
+ 1
11437
+ 1
11438
+ 1
11439
+ 1
11440
+ 1
11441
+ 1
11442
+ 1
11443
+ 1
11444
+ 1
11445
+ 1
11446
+ 1
11447
+ 1
11448
+ 1
11449
+ 1
11450
+ 1
11451
+ 1
11452
+ 1
11453
+ 1
11454
+ 1
11455
+ 1
11456
+ 1
11457
+ 1
11458
+ 1
11459
+ 1
11460
+ 1
11461
+ 1
11462
+ 1
11463
+ 1
11464
+ 1
11465
+ 1
11466
+ 1
11467
+ 1
11468
+ 1
11469
+ 1
11470
+ 1
11471
+ 1
11472
+ 1
11473
+ 1
11474
+ 1
11475
+ 1
11476
+ 1
11477
+ 1
11478
+ 1
11479
+ 1
11480
+ 1
11481
+ 1
11482
+ 1
11483
+ 1
11484
+ 1
11485
+ 1
11486
+ 1
11487
+ 1
11488
+ 1
11489
+ 1
11490
+ 1
11491
+ 1
11492
+ 1
11493
+ 1
11494
+ 1
11495
+ 1
11496
+ 1
11497
+ 1
11498
+ 1
11499
+ 1
11500
+ 1
11501
+ 1
11502
+ 1
11503
+ 1
11504
+ 1
11505
+ 1
11506
+ 1
11507
+ 1
11508
+ 1
11509
+ 1
11510
+ 1
11511
+ 1
11512
+ 1
11513
+ 1
11514
+ 1
11515
+ 1
11516
+ 1
11517
+ 1
11518
+ 1
11519
+ 1
11520
+ 1
11521
+ 1
11522
+ 1
11523
+ 1
11524
+ 1
11525
+ 1
11526
+ 1
11527
+ 1
11528
+ 1
11529
+ 1
11530
+ 1
11531
+ 1
11532
+ 1
11533
+ 1
11534
+ 1
11535
+ 1
11536
+ 1
11537
+ 1
11538
+ 1
11539
+ 1
11540
+ 1
11541
+ 1
11542
+ 1
11543
+ 1
11544
+ 1
11545
+ 1
11546
+ 1
11547
+ 1
11548
+ 1
11549
+ 1
11550
+ 1
11551
+ 1
11552
+ 1
11553
+ 1
11554
+ 1
11555
+ 1
11556
+ 1
11557
+ 1
11558
+ 1
11559
+ 1
11560
+ 1
11561
+ 1
11562
+ 1
11563
+ 1
11564
+ 1
11565
+ 1
11566
+ 1
11567
+ 1
11568
+ 1
11569
+ 1
11570
+ 1
11571
+ 1
11572
+ 1
11573
+ 1
11574
+ 1
11575
+ 1
11576
+ 1
11577
+ 1
11578
+ 1
11579
+ 1
11580
+ 1
11581
+ 1
11582
+ 1
11583
+ 1
11584
+ 1
11585
+ 1
11586
+ 1
11587
+ 1
11588
+ 1
11589
+ 1
11590
+ 1
11591
+ 1
11592
+ 1
11593
+ 1
11594
+ 1
11595
+ 1
11596
+ 1
11597
+ 1
11598
+ 1
11599
+ 1
11600
+ 1
11601
+ 1
11602
+ 1
11603
+ 1
11604
+ 1
11605
+ 1
11606
+ 1
11607
+ 1
11608
+ 2
11609
+ 1
11610
+ 1
11611
+ 2
11612
+ 1
11613
+ 1
11614
+ 1
11615
+ 1
11616
+ 1
11617
+ 1
11618
+ 1
11619
+ 1
11620
+ 1
11621
+ 1
11622
+ 1
11623
+ 1
11624
+ 1
11625
+ 1
11626
+ 1
11627
+ 1
11628
+ 1
11629
+ 1
11630
+ 1
11631
+ 1
11632
+ 1
11633
+ 1
11634
+ 1
11635
+ 1
11636
+ 1
11637
+ 1
11638
+ 1
11639
+ 1
11640
+ 1
11641
+ 1
11642
+ 1
11643
+ 1
11644
+ 1
11645
+ 1
11646
+ 1
11647
+ 1
11648
+ 1
11649
+ 1
11650
+ 1
11651
+ 1
11652
+ 1
11653
+ 1
11654
+ 1
11655
+ 1
11656
+ 1
11657
+ 1
11658
+ 1
11659
+ 1
11660
+ 1
11661
+ 1
11662
+ 1
11663
+ 1
11664
+ 1
11665
+ 1
11666
+ 1
11667
+ 1
11668
+ 1
11669
+ 1
11670
+ 1
11671
+ 1
11672
+ 1
11673
+ 1
11674
+ 1
11675
+ 1
11676
+ 1
11677
+ 1
11678
+ 1
11679
+ 1
11680
+ 1
11681
+ 1
11682
+ 1
11683
+ 1
11684
+ 1
11685
+ 1
11686
+ 1
11687
+ 1
11688
+ 1
11689
+ 1
11690
+ 1
11691
+ 1
11692
+ 1
11693
+ 1
11694
+ 1
11695
+ 1
11696
+ 1
11697
+ 1
11698
+ 1
11699
+ 1
11700
+ 1
11701
+ 1
11702
+ 1
11703
+ 1
11704
+ 1
11705
+ 1
11706
+ 1
11707
+ 1
11708
+ 1
11709
+ 1
11710
+ 1
11711
+ 1
11712
+ 1
11713
+ 1
11714
+ 1
11715
+ 1
11716
+ 1
11717
+ 1
11718
+ 1
11719
+ 1
11720
+ 1
11721
+ 1
11722
+ 1
11723
+ 1
11724
+ 1
11725
+ 1
11726
+ 1
11727
+ 1
11728
+ 1
11729
+ 1
11730
+ 1
11731
+ 1
11732
+ 1
11733
+ 1
11734
+ 1
11735
+ 1
11736
+ 1
11737
+ 1
11738
+ 1
11739
+ 1
11740
+ 1
11741
+ 1
11742
+ 1
11743
+ 1
11744
+ 1
11745
+ 1
11746
+ 1
11747
+ 1
11748
+ 1
11749
+ 1
11750
+ 1
11751
+ 1
11752
+ 1
11753
+ 1
11754
+ 1
11755
+ 1
11756
+ 1
11757
+ 1
11758
+ 1
11759
+ 1
11760
+ 1
11761
+ 1
11762
+ 1
11763
+ 1
11764
+ 1
11765
+ 1
11766
+ 1
11767
+ 1
11768
+ 1
11769
+ 1
11770
+ 1
11771
+ 1
11772
+ 1
11773
+ 1
11774
+ 1
11775
+ 1
11776
+ 1
11777
+ 1
11778
+ 1
11779
+ 1
11780
+ 1
11781
+ 1
11782
+ 1
11783
+ 1
11784
+ 1
11785
+ 1
11786
+ 1
11787
+ 1
11788
+ 1
11789
+ 1
11790
+ 1
11791
+ 1
11792
+ 1
11793
+ 1
11794
+ 1
11795
+ 1
11796
+ 1
11797
+ 1
11798
+ 1
11799
+ 1
11800
+ 1
11801
+ 1
11802
+ 1
11803
+ 1
11804
+ 1
11805
+ 1
11806
+ 1
11807
+ 1
11808
+ 1
11809
+ 1
11810
+ 1
11811
+ 1
11812
+ 1
11813
+ 1
11814
+ 1
11815
+ 1
11816
+ 1
11817
+ 1
11818
+ 1
11819
+ 1
11820
+ 1
11821
+ 1
11822
+ 1
11823
+ 1
11824
+ 1
11825
+ 1
11826
+ 1
11827
+ 1
11828
+ 1
11829
+ 1
11830
+ 1
11831
+ 1
11832
+ 1
11833
+ 1
11834
+ 1
11835
+ 1
11836
+ 1
11837
+ 1
11838
+ 1
11839
+ 1
11840
+ 1
11841
+ 1
11842
+ 1
11843
+ 1
11844
+ 1
11845
+ 1
11846
+ 1
11847
+ 1
11848
+ 1
11849
+ 1
11850
+ 1
11851
+ 1
11852
+ 1
11853
+ 1
11854
+ 1
11855
+ 1
11856
+ 1
11857
+ 1
11858
+ 1
11859
+ 1
11860
+ 1
11861
+ 1
11862
+ 1
11863
+ 1
11864
+ 1
11865
+ 2
11866
+ 1
11867
+ 1
11868
+ 1
11869
+ 1
11870
+ 1
11871
+ 1
11872
+ 1
11873
+ 1
11874
+ 1
11875
+ 1
11876
+ 1
11877
+ 1
11878
+ 1
11879
+ 1
11880
+ 1
11881
+ 1
11882
+ 1
11883
+ 1
11884
+ 1
11885
+ 1
11886
+ 1
11887
+ 1
11888
+ 1
11889
+ 1
11890
+ 1
11891
+ 1
11892
+ 1
11893
+ 1
11894
+ 1
11895
+ 1
11896
+ 1
11897
+ 1
11898
+ 1
11899
+ 1
11900
+ 1
11901
+ 1
11902
+ 1
11903
+ 1
11904
+ 1
11905
+ 1
11906
+ 1
11907
+ 1
11908
+ 1
11909
+ 1
11910
+ 1
11911
+ 1
11912
+ 1
11913
+ 1
11914
+ 1
11915
+ 1
11916
+ 1
11917
+ 1
11918
+ 1
11919
+ 1
11920
+ 1
11921
+ 1
11922
+ 1
11923
+ 1
11924
+ 1
11925
+ 1
11926
+ 1
11927
+ 1
11928
+ 1
11929
+ 1
11930
+ 1
11931
+ 1
11932
+ 1
11933
+ 1
11934
+ 1
11935
+ 1
11936
+ 1
11937
+ 1
11938
+ 1
11939
+ 1
11940
+ 1
11941
+ 1
11942
+ 1
11943
+ 1
11944
+ 1
11945
+ 1
11946
+ 1
11947
+ 1
11948
+ 1
11949
+ 1
11950
+ 1
11951
+ 1
11952
+ 1
11953
+ 1
11954
+ 1
11955
+ 1
11956
+ 1
11957
+ 1
11958
+ 1
11959
+ 1
11960
+ 1
11961
+ 1
11962
+ 1
11963
+ 1
11964
+ 1
11965
+ 1
11966
+ 1
11967
+ 1
11968
+ 1
11969
+ 1
11970
+ 1
11971
+ 1
11972
+ 1
11973
+ 1
11974
+ 1
11975
+ 1
11976
+ 1
11977
+ 1
11978
+ 1
11979
+ 1
11980
+ 1
11981
+ 1
11982
+ 1
11983
+ 1
11984
+ 1
11985
+ 1
11986
+ 1
11987
+ 1
11988
+ 1
11989
+ 1
11990
+ 1
11991
+ 1
11992
+ 1
11993
+ 1
11994
+ 1
11995
+ 1
11996
+ 1
11997
+ 1
11998
+ 1
11999
+ 1
12000
+ 1
12001
+ 1
12002
+ 1
12003
+ 1
12004
+ 1
12005
+ 1
12006
+ 1
12007
+ 1
12008
+ 1
12009
+ 1
12010
+ 1
12011
+ 1
12012
+ 1
12013
+ 1
12014
+ 1
12015
+ 1
12016
+ 1
12017
+ 1
12018
+ 1
12019
+ 1
12020
+ 1
12021
+ 1
12022
+ 1
12023
+ 1
12024
+ 1
12025
+ 1
12026
+ 1
12027
+ 1
12028
+ 1
12029
+ 1
12030
+ 1
12031
+ 1
12032
+ 1
12033
+ 1
12034
+ 1
12035
+ 1
12036
+ 1
12037
+ 1
12038
+ 1
12039
+ 1
12040
+ 1
12041
+ 1
12042
+ 1
12043
+ 1
12044
+ 1
12045
+ 1
12046
+ 1
12047
+ 1
12048
+ 1
12049
+ 1
12050
+ 1
12051
+ 1
12052
+ 1
12053
+ 1
12054
+ 1
12055
+ 1
12056
+ 1
12057
+ 1
12058
+ 1
12059
+ 1
12060
+ 1
12061
+ 1
12062
+ 1
12063
+ 1
12064
+ 1
12065
+ 1
12066
+ 1
12067
+ 1
12068
+ 1
12069
+ 1
12070
+ 1
12071
+ 1
12072
+ 1
12073
+ 1
12074
+ 1
12075
+ 1
12076
+ 1
12077
+ 1
12078
+ 1
12079
+ 1
12080
+ 1
12081
+ 1
12082
+ 1
12083
+ 1
12084
+ 1
12085
+ 1
12086
+ 1
12087
+ 1
12088
+ 1
12089
+ 1
12090
+ 1
12091
+ 1
12092
+ 1
12093
+ 1
12094
+ 1
12095
+ 1
12096
+ 1
12097
+ 1
12098
+ 1
12099
+ 1
12100
+ 1
12101
+ 1
12102
+ 1
12103
+ 1
12104
+ 1
12105
+ 1
12106
+ 1
12107
+ 1
12108
+ 1
12109
+ 1
12110
+ 1
12111
+ 1
12112
+ 1
12113
+ 1
12114
+ 1
12115
+ 1
12116
+ 1
12117
+ 1
12118
+ 1
12119
+ 1
12120
+ 1
12121
+ 1
12122
+ 1
12123
+ 1
12124
+ 1
12125
+ 1
12126
+ 1
12127
+ 1
12128
+ 1
12129
+ 1
12130
+ 1
12131
+ 1
12132
+ 1
12133
+ 1
12134
+ 1
12135
+ 1
12136
+ 1
12137
+ 1
12138
+ 1
12139
+ 1
12140
+ 1
12141
+ 1
12142
+ 1
12143
+ 1
12144
+ 1
12145
+ 1
12146
+ 1
12147
+ 1
12148
+ 1
12149
+ 1
12150
+ 1
12151
+ 1
12152
+ 1
12153
+ 1
12154
+ 1
12155
+ 1
12156
+ 1
12157
+ 1
12158
+ 1
12159
+ 1
12160
+ 1
12161
+ 1
12162
+ 1
12163
+ 1
12164
+ 1
12165
+ 1
12166
+ 1
12167
+ 1
12168
+ 1
12169
+ 1
12170
+ 1
12171
+ 1
12172
+ 1
12173
+ 1
12174
+ 1
12175
+ 1
12176
+ 1
12177
+ 1
12178
+ 1
12179
+ 1
12180
+ 1
12181
+ 1
12182
+ 1
12183
+ 1
12184
+ 1
12185
+ 1
12186
+ 1
12187
+ 1
12188
+ 1
12189
+ 1
12190
+ 1
12191
+ 1
12192
+ 1
12193
+ 1
12194
+ 1
12195
+ 1
12196
+ 1
12197
+ 1
12198
+ 1
12199
+ 1
12200
+ 1
12201
+ 1
12202
+ 1
12203
+ 1
12204
+ 1
12205
+ 1
12206
+ 1
12207
+ 1
12208
+ 1
12209
+ 1
12210
+ 1
12211
+ 1
12212
+ 1
12213
+ 1
12214
+ 1
12215
+ 1
12216
+ 1
12217
+ 1
12218
+ 1
12219
+ 1
12220
+ 1
12221
+ 1
12222
+ 1
12223
+ 1
12224
+ 1
12225
+ 1
12226
+ 1
12227
+ 1
12228
+ 1
12229
+ 1
12230
+ 1
12231
+ 1
12232
+ 1
12233
+ 1
12234
+ 1
12235
+ 1
12236
+ 1
12237
+ 1
12238
+ 1
12239
+ 1
12240
+ 1
12241
+ 1
12242
+ 1
12243
+ 1
12244
+ 1
12245
+ 1
12246
+ 1
12247
+ 1
12248
+ 1
12249
+ 1
12250
+ 1
12251
+ 1
12252
+ 1
12253
+ 1
12254
+ 1
12255
+ 1
12256
+ 1
12257
+ 1
12258
+ 1
12259
+ 1
12260
+ 1
12261
+ 1
12262
+ 1
12263
+ 1
12264
+ 1
12265
+ 1
12266
+ 1
12267
+ 1
12268
+ 1
12269
+ 1
12270
+ 1
12271
+ 1
12272
+ 1
12273
+ 1
12274
+ 1
12275
+ 1
12276
+ 1
12277
+ 1
12278
+ 1
12279
+ 1
12280
+ 1
12281
+ 1
12282
+ 1
12283
+ 1
12284
+ 1
12285
+ 1
12286
+ 1
12287
+ 1
12288
+ 1
12289
+ 1
12290
+ 1
12291
+ 1
12292
+ 1
12293
+ 1
12294
+ 1
12295
+ 1
12296
+ 1
12297
+ 1
12298
+ 1
12299
+ 1
12300
+ 1
12301
+ 1
12302
+ 1
12303
+ 1
12304
+ 1
12305
+ 1
12306
+ 1
12307
+ 1
12308
+ 1
12309
+ 1
12310
+ 1
12311
+ 1
12312
+ 1
12313
+ 1
12314
+ 1
12315
+ 1
12316
+ 1
12317
+ 1
12318
+ 1
12319
+ 1
12320
+ 1
12321
+ 1
12322
+ 1
12323
+ 1
12324
+ 1
12325
+ 1
12326
+ 1
12327
+ 1
12328
+ 1
12329
+ 1
12330
+ 1
12331
+ 1
12332
+ 1
12333
+ 1
12334
+ 1
12335
+ 1
12336
+ 1
12337
+ 1
12338
+ 1
12339
+ 1
12340
+ 1
12341
+ 1
12342
+ 1
12343
+ 1
12344
+ 1
12345
+ 1
12346
+ 1
12347
+ 1
12348
+ 1
12349
+ 1
12350
+ 1
12351
+ 1
12352
+ 1
12353
+ 1
12354
+ 1
12355
+ 1
12356
+ 1
12357
+ 1
12358
+ 1
12359
+ 1
12360
+ 1
12361
+ 1
12362
+ 1
12363
+ 1
12364
+ 1
12365
+ 1
12366
+ 1
12367
+ 1
12368
+ 1
12369
+ 1
12370
+ 1
12371
+ 1
12372
+ 1
12373
+ 1
12374
+ 1
12375
+ 1
12376
+ 1
12377
+ 1
12378
+ 1
12379
+ 1
12380
+ 1
12381
+ 1
12382
+ 1
12383
+ 1
12384
+ 1
12385
+ 1
12386
+ 1
12387
+ 1
12388
+ 1
12389
+ 1
12390
+ 1
12391
+ 2
12392
+ 1
12393
+ 1
12394
+ 2
12395
+ 1
12396
+ 1
12397
+ 2
12398
+ 1
12399
+ 1
12400
+ 2
12401
+ 1
12402
+ 1
12403
+ 1
12404
+ 1
12405
+ 1
12406
+ 1
12407
+ 1
12408
+ 1
12409
+ 1
12410
+ 1
12411
+ 1
12412
+ 1
12413
+ 1
12414
+ 1
12415
+ 1
12416
+ 1
12417
+ 1
12418
+ 1
12419
+ 1
12420
+ 1
12421
+ 1
12422
+ 1
12423
+ 1
12424
+ 1
12425
+ 1
12426
+ 1
12427
+ 1
12428
+ 1
12429
+ 1
12430
+ 1
12431
+ 1
12432
+ 1
12433
+ 1
12434
+ 1
12435
+ 1
12436
+ 1
12437
+ 1
12438
+ 1
12439
+ 1
12440
+ 1
12441
+ 1
12442
+ 1
12443
+ 1
12444
+ 1
12445
+ 1
12446
+ 1
12447
+ 1
12448
+ 1
12449
+ 1
12450
+ 1
12451
+ 1
12452
+ 1
12453
+ 1
12454
+ 1
12455
+ 1
12456
+ 1
12457
+ 1
12458
+ 1
12459
+ 1
12460
+ 1
12461
+ 1
12462
+ 1
12463
+ 1
12464
+ 1
12465
+ 1
12466
+ 1
12467
+ 1
12468
+ 1
12469
+ 1
12470
+ 1
12471
+ 1
12472
+ 1
12473
+ 1
12474
+ 1
12475
+ 1
12476
+ 1
12477
+ 1
12478
+ 1
12479
+ 1
12480
+ 1
12481
+ 1
12482
+ 1
12483
+ 1
12484
+ 1
12485
+ 1
12486
+ 1
12487
+ 1
12488
+ 1
12489
+ 1
12490
+ 1
12491
+ 1
12492
+ 1
12493
+ 1
12494
+ 1
12495
+ 1
12496
+ 1
12497
+ 1
12498
+ 1
12499
+ 1
12500
+ 1
12501
+ 1
12502
+ 1
12503
+ 1
12504
+ 1
12505
+ 1
12506
+ 1
12507
+ 1
12508
+ 1
12509
+ 1
12510
+ 1
12511
+ 1
12512
+ 1
12513
+ 1
12514
+ 1
12515
+ 1
12516
+ 1
12517
+ 1
12518
+ 1
12519
+ 1
12520
+ 1
12521
+ 1
12522
+ 1
12523
+ 1
12524
+ 1
12525
+ 1
12526
+ 1
12527
+ 1
12528
+ 1
12529
+ 1
12530
+ 1
12531
+ 1
12532
+ 1
12533
+ 1
12534
+ 1
12535
+ 1
12536
+ 1
12537
+ 1
12538
+ 1
12539
+ 1
12540
+ 1
12541
+ 1
12542
+ 1
12543
+ 1
12544
+ 1
12545
+ 1
12546
+ 1
12547
+ 1
12548
+ 1
12549
+ 1
12550
+ 1
12551
+ 1
12552
+ 1
12553
+ 1
12554
+ 1
12555
+ 1
12556
+ 1
12557
+ 1
12558
+ 1
12559
+ 1
12560
+ 1
12561
+ 1
12562
+ 1
12563
+ 1
12564
+ 1
12565
+ 1
12566
+ 1
12567
+ 1
12568
+ 1
12569
+ 1
12570
+ 1
12571
+ 1
12572
+ 1
12573
+ 1
12574
+ 1
12575
+ 1
12576
+ 1
12577
+ 1
12578
+ 1
12579
+ 1
12580
+ 1
12581
+ 1
12582
+ 1
12583
+ 1
12584
+ 1
12585
+ 1
12586
+ 1
12587
+ 1
12588
+ 1
12589
+ 1
12590
+ 1
12591
+ 1
12592
+ 1
12593
+ 1
12594
+ 1
12595
+ 1
12596
+ 1
12597
+ 1
12598
+ 1
12599
+ 1
12600
+ 1
12601
+ 1
12602
+ 1
12603
+ 1
12604
+ 1
12605
+ 1
12606
+ 1
12607
+ 1
12608
+ 1
12609
+ 1
12610
+ 1
12611
+ 1
12612
+ 1
12613
+ 1
12614
+ 1
12615
+ 1
12616
+ 1
12617
+ 1
12618
+ 1
12619
+ 1
12620
+ 1
12621
+ 1
12622
+ 1
12623
+ 1
12624
+ 1
12625
+ 1
12626
+ 1
12627
+ 1
12628
+ 1
12629
+ 1
12630
+ 1
12631
+ 1
12632
+ 1
12633
+ 1
12634
+ 1
12635
+ 1
12636
+ 1
12637
+ 1
12638
+ 1
12639
+ 1
12640
+ 1
12641
+ 1
12642
+ 1
12643
+ 1
12644
+ 1
12645
+ 1
12646
+ 1
12647
+ 1
12648
+ 1
12649
+ 1
12650
+ 1
12651
+ 1
12652
+ 1
12653
+ 1
12654
+ 1
12655
+ 1
12656
+ 1
12657
+ 1
12658
+ 1
12659
+ 1
12660
+ 1
12661
+ 1
12662
+ 1
12663
+ 1
12664
+ 1
12665
+ 1
12666
+ 1
12667
+ 1
12668
+ 1
12669
+ 1
12670
+ 1
12671
+ 1
12672
+ 2
12673
+ 1
12674
+ 1
12675
+ 1
12676
+ 1
12677
+ 1
12678
+ 1
12679
+ 1
12680
+ 1
12681
+ 1
12682
+ 1
12683
+ 1
12684
+ 1
12685
+ 1
12686
+ 1
12687
+ 1
12688
+ 1
12689
+ 1
12690
+ 1
12691
+ 1
12692
+ 1
12693
+ 1
12694
+ 1
12695
+ 1
12696
+ 1
12697
+ 1
12698
+ 1
12699
+ 1
12700
+ 1
12701
+ 1
12702
+ 1
12703
+ 1
12704
+ 1
12705
+ 1
12706
+ 1
12707
+ 1
12708
+ 1
12709
+ 1
12710
+ 1
12711
+ 1
12712
+ 1
12713
+ 1
12714
+ 1
12715
+ 1
12716
+ 1
12717
+ 1
12718
+ 1
12719
+ 1
12720
+ 1
12721
+ 1
12722
+ 1
12723
+ 1
12724
+ 1
12725
+ 1
12726
+ 1
12727
+ 1
12728
+ 1
12729
+ 1
12730
+ 1
12731
+ 1
12732
+ 1
12733
+ 1
12734
+ 1
12735
+ 1
12736
+ 1
12737
+ 1
12738
+ 1
12739
+ 1
12740
+ 1
12741
+ 1
12742
+ 1
12743
+ 1
12744
+ 1
12745
+ 1
12746
+ 1
12747
+ 1
12748
+ 1
12749
+ 1
12750
+ 1
12751
+ 1
12752
+ 1
12753
+ 1
12754
+ 1
12755
+ 1
12756
+ 1
12757
+ 1
12758
+ 1
12759
+ 1
12760
+ 1
12761
+ 1
12762
+ 1
12763
+ 1
12764
+ 1
12765
+ 1
12766
+ 1
12767
+ 1
12768
+ 1
12769
+ 1
12770
+ 1
12771
+ 1
12772
+ 1
12773
+ 1
12774
+ 1
12775
+ 1
12776
+ 1
12777
+ 1
12778
+ 1
12779
+ 1
12780
+ 1
12781
+ 1
12782
+ 1
12783
+ 1
12784
+ 1
12785
+ 1
12786
+ 1
12787
+ 1
12788
+ 1
12789
+ 1
12790
+ 1
12791
+ 1
12792
+ 1
12793
+ 1
12794
+ 1
12795
+ 1
12796
+ 1
12797
+ 1
12798
+ 1
12799
+ 1
12800
+ 1
12801
+ 1
12802
+ 1
12803
+ 1
12804
+ 1
12805
+ 1
12806
+ 1
12807
+ 1
12808
+ 1
12809
+ 1
12810
+ 1
12811
+ 1
12812
+ 1
12813
+ 1
12814
+ 1
12815
+ 1
12816
+ 1
12817
+ 1
12818
+ 1
12819
+ 1
12820
+ 1
12821
+ 1
12822
+ 1
12823
+ 1
12824
+ 1
12825
+ 1
12826
+ 1
12827
+ 1
12828
+ 1
12829
+ 1
12830
+ 1
12831
+ 1
12832
+ 1
12833
+ 1
12834
+ 1
12835
+ 1
12836
+ 1
12837
+ 1
12838
+ 1
12839
+ 1
12840
+ 1
12841
+ 1
12842
+ 1
12843
+ 1
12844
+ 1
12845
+ 1
12846
+ 1
12847
+ 1
12848
+ 1
12849
+ 1
12850
+ 1
12851
+ 1
12852
+ 1
12853
+ 1
12854
+ 1
12855
+ 1
12856
+ 1
12857
+ 1
12858
+ 1
12859
+ 1
12860
+ 1
12861
+ 1
12862
+ 1
12863
+ 1
12864
+ 1
12865
+ 1
12866
+ 1
12867
+ 1
12868
+ 1
12869
+ 1
12870
+ 1
12871
+ 1
12872
+ 1
12873
+ 1
12874
+ 1
12875
+ 1
12876
+ 1
12877
+ 1
12878
+ 1
12879
+ 1
12880
+ 1
12881
+ 1
12882
+ 1
12883
+ 1
12884
+ 1
12885
+ 1
12886
+ 1
12887
+ 1
12888
+ 1
12889
+ 1
12890
+ 1
12891
+ 1
12892
+ 1
12893
+ 1
12894
+ 1
12895
+ 1
12896
+ 1
12897
+ 1
12898
+ 1
12899
+ 1
12900
+ 1
12901
+ 1
12902
+ 1
12903
+ 1
12904
+ 1
12905
+ 1
12906
+ 1
12907
+ 1
12908
+ 1
12909
+ 1
12910
+ 1
12911
+ 1
12912
+ 1
12913
+ 1
12914
+ 1
12915
+ 1
12916
+ 1
12917
+ 1
12918
+ 1
12919
+ 1
12920
+ 1
12921
+ 1
12922
+ 2
12923
+ 1
12924
+ 1
12925
+ 1
12926
+ 1
12927
+ 1
12928
+ 1
12929
+ 1
12930
+ 1
12931
+ 2
12932
+ 1
12933
+ 1
12934
+ 1
12935
+ 1
12936
+ 1
12937
+ 1
12938
+ 1
12939
+ 1
12940
+ 1
12941
+ 1
12942
+ 1
12943
+ 1
12944
+ 1
12945
+ 1
12946
+ 1
12947
+ 1
12948
+ 1
12949
+ 1
12950
+ 1
12951
+ 1
12952
+ 1
12953
+ 1
12954
+ 1
12955
+ 1
12956
+ 1
12957
+ 1
12958
+ 1
12959
+ 1
12960
+ 1
12961
+ 1
12962
+ 1
12963
+ 1
12964
+ 1
12965
+ 1
12966
+ 1
12967
+ 1
12968
+ 1
12969
+ 1
12970
+ 1
12971
+ 1
12972
+ 1
12973
+ 1
12974
+ 1
12975
+ 1
12976
+ 1
12977
+ 1
12978
+ 1
12979
+ 1
12980
+ 1
12981
+ 1
12982
+ 1
12983
+ 1
12984
+ 1
12985
+ 1
12986
+ 1
12987
+ 1
12988
+ 1
12989
+ 1
12990
+ 1
12991
+ 1
12992
+ 1
12993
+ 1
12994
+ 1
12995
+ 1
12996
+ 1
12997
+ 1
12998
+ 1
12999
+ 1
13000
+ 1
13001
+ 1
13002
+ 1
13003
+ 1
13004
+ 1
13005
+ 1
13006
+ 1
13007
+ 1
13008
+ 1
13009
+ 1
13010
+ 1
13011
+ 1
13012
+ 1
13013
+ 1
13014
+ 1
13015
+ 1
13016
+ 1
13017
+ 1
13018
+ 1
13019
+ 1
13020
+ 1
13021
+ 1
13022
+ 1
13023
+ 1
13024
+ 1
13025
+ 1
13026
+ 1
13027
+ 1
13028
+ 1
13029
+ 1
13030
+ 1
13031
+ 1
13032
+ 1
13033
+ 1
13034
+ 1
13035
+ 1
13036
+ 1
13037
+ 1
13038
+ 1
13039
+ 1
13040
+ 1
13041
+ 1
13042
+ 1
13043
+ 1
13044
+ 1
13045
+ 1
13046
+ 1
13047
+ 1
13048
+ 1
13049
+ 1
13050
+ 1
13051
+ 1
13052
+ 1
13053
+ 1
13054
+ 1
13055
+ 1
13056
+ 1
13057
+ 1
13058
+ 1
13059
+ 1
13060
+ 1
13061
+ 1
13062
+ 1
13063
+ 1
13064
+ 1
13065
+ 1
13066
+ 1
13067
+ 1
13068
+ 1
13069
+ 1
13070
+ 1
13071
+ 1
13072
+ 1
13073
+ 1
13074
+ 1
13075
+ 1
13076
+ 1
13077
+ 1
13078
+ 1
13079
+ 1
13080
+ 1
13081
+ 1
13082
+ 1
13083
+ 1
13084
+ 1
13085
+ 1
13086
+ 1
13087
+ 1
13088
+ 1
13089
+ 1
13090
+ 1
13091
+ 1
13092
+ 1
13093
+ 1
13094
+ 1
13095
+ 1
13096
+ 1
13097
+ 1
13098
+ 1
13099
+ 1
13100
+ 1
13101
+ 1
13102
+ 1
13103
+ 1
13104
+ 1
13105
+ 1
13106
+ 1
13107
+ 1
13108
+ 1
13109
+ 1
13110
+ 1
13111
+ 1
13112
+ 1
13113
+ 1
13114
+ 1
13115
+ 1
13116
+ 1
13117
+ 1
13118
+ 1
13119
+ 1
13120
+ 1
13121
+ 1
13122
+ 1
13123
+ 1
13124
+ 1
13125
+ 1
13126
+ 1
13127
+ 1
13128
+ 1
13129
+ 1
13130
+ 1
13131
+ 1
13132
+ 1
13133
+ 1
13134
+ 1
13135
+ 1
13136
+ 1
13137
+ 1
13138
+ 1
13139
+ 1
13140
+ 1
13141
+ 1
13142
+ 1
13143
+ 1
13144
+ 1
13145
+ 1
13146
+ 1
13147
+ 1
13148
+ 1
13149
+ 1
13150
+ 1
13151
+ 1
13152
+ 1
13153
+ 1
13154
+ 1
13155
+ 1
13156
+ 1
13157
+ 1
13158
+ 1
13159
+ 1
13160
+ 1
13161
+ 1
13162
+ 1
13163
+ 1
13164
+ 1
13165
+ 1
13166
+ 1
13167
+ 1
13168
+ 1
13169
+ 1
13170
+ 1
13171
+ 1
13172
+ 1
13173
+ 1
13174
+ 1
13175
+ 1
13176
+ 1
13177
+ 1
13178
+ 1
13179
+ 2
13180
+ 1
13181
+ 1
13182
+ 1
13183
+ 1
13184
+ 1
13185
+ 1
13186
+ 1
13187
+ 1
13188
+ 1
13189
+ 1
13190
+ 1
13191
+ 1
13192
+ 1
13193
+ 1
13194
+ 1
13195
+ 1
13196
+ 1
13197
+ 1
13198
+ 1
13199
+ 1
13200
+ 1
13201
+ 1
13202
+ 1
13203
+ 1
13204
+ 1
13205
+ 1
13206
+ 1
13207
+ 1
13208
+ 1
13209
+ 1
13210
+ 1
13211
+ 1
13212
+ 1
13213
+ 1
13214
+ 1
13215
+ 1
13216
+ 1
13217
+ 1
13218
+ 1
13219
+ 1
13220
+ 1
13221
+ 1
13222
+ 1
13223
+ 1
13224
+ 1
13225
+ 1
13226
+ 1
13227
+ 1
13228
+ 1
13229
+ 1
13230
+ 1
13231
+ 1
13232
+ 1
13233
+ 1
13234
+ 1
13235
+ 1
13236
+ 1
13237
+ 1
13238
+ 1
13239
+ 1
13240
+ 1
13241
+ 1
13242
+ 1
13243
+ 1
13244
+ 1
13245
+ 1
13246
+ 1
13247
+ 1
13248
+ 1
13249
+ 1
13250
+ 1
13251
+ 1
13252
+ 1
13253
+ 1
13254
+ 1
13255
+ 1
13256
+ 1
13257
+ 1
13258
+ 1
13259
+ 1
13260
+ 1
13261
+ 1
13262
+ 1
13263
+ 1
13264
+ 1
13265
+ 1
13266
+ 1
13267
+ 1
13268
+ 1
13269
+ 1
13270
+ 1
13271
+ 1
13272
+ 1
13273
+ 1
13274
+ 1
13275
+ 1
13276
+ 1
13277
+ 1
13278
+ 1
13279
+ 1
13280
+ 1
13281
+ 1
13282
+ 1
13283
+ 1
13284
+ 1
13285
+ 1
13286
+ 1
13287
+ 1
13288
+ 1
13289
+ 1
13290
+ 1
13291
+ 1
13292
+ 1
13293
+ 1
13294
+ 1
13295
+ 1
13296
+ 1
13297
+ 1
13298
+ 1
13299
+ 1
13300
+ 1
13301
+ 1
13302
+ 1
13303
+ 1
13304
+ 1
13305
+ 1
13306
+ 1
13307
+ 1
13308
+ 1
13309
+ 1
13310
+ 1
13311
+ 1
13312
+ 1
13313
+ 1
13314
+ 1
13315
+ 1
13316
+ 1
13317
+ 1
13318
+ 1
13319
+ 1
13320
+ 1
13321
+ 1
13322
+ 1
13323
+ 1
13324
+ 1
13325
+ 1
13326
+ 1
13327
+ 1
13328
+ 1
13329
+ 1
13330
+ 1
13331
+ 1
13332
+ 1
13333
+ 1
13334
+ 1
13335
+ 1
13336
+ 1
13337
+ 1
13338
+ 1
13339
+ 1
13340
+ 1
13341
+ 1
13342
+ 1
13343
+ 1
13344
+ 1
13345
+ 1
13346
+ 1
13347
+ 1
13348
+ 1
13349
+ 1
13350
+ 1
13351
+ 1
13352
+ 1
13353
+ 1
13354
+ 1
13355
+ 1
13356
+ 1
13357
+ 1
13358
+ 1
13359
+ 1
13360
+ 1
13361
+ 1
13362
+ 1
13363
+ 1
13364
+ 1
13365
+ 1
13366
+ 1
13367
+ 1
13368
+ 1
13369
+ 1
13370
+ 1
13371
+ 1
13372
+ 1
13373
+ 1
13374
+ 1
13375
+ 1
13376
+ 1
13377
+ 1
13378
+ 1
13379
+ 1
13380
+ 1
13381
+ 1
13382
+ 1
13383
+ 1
13384
+ 1
13385
+ 1
13386
+ 1
13387
+ 1
13388
+ 1
13389
+ 1
13390
+ 1
13391
+ 1
13392
+ 1
13393
+ 1
13394
+ 1
13395
+ 1
13396
+ 1
13397
+ 1
13398
+ 1
13399
+ 1
13400
+ 1
13401
+ 1
13402
+ 1
13403
+ 1
13404
+ 1
13405
+ 1
13406
+ 1
13407
+ 1
13408
+ 1
13409
+ 1
13410
+ 1
13411
+ 1
13412
+ 1
13413
+ 1
13414
+ 1
13415
+ 1
13416
+ 1
13417
+ 1
13418
+ 1
13419
+ 1
13420
+ 1
13421
+ 1
13422
+ 1
13423
+ 1
13424
+ 1
13425
+ 1
13426
+ 1
13427
+ 1
13428
+ 1
13429
+ 1
13430
+ 1
13431
+ 1
13432
+ 1
13433
+ 1
13434
+ 1
13435
+ 1
13436
+ 1
13437
+ 1
13438
+ 1
13439
+ 1
13440
+ 1
13441
+ 1
13442
+ 1
13443
+ 1
13444
+ 1
13445
+ 1
13446
+ 1
13447
+ 1
13448
+ 1
13449
+ 1
13450
+ 1
13451
+ 1
13452
+ 1
13453
+ 1
13454
+ 2
13455
+ 1
13456
+ 1
13457
+ 1
13458
+ 1
13459
+ 1
13460
+ 1
13461
+ 1
13462
+ 1
13463
+ 1
13464
+ 1
13465
+ 1
13466
+ 1
13467
+ 1
13468
+ 1
13469
+ 1
13470
+ 1
13471
+ 1
13472
+ 1
13473
+ 1
13474
+ 1
13475
+ 1
13476
+ 1
13477
+ 1
13478
+ 1
13479
+ 1
13480
+ 1
13481
+ 1
13482
+ 1
13483
+ 1
13484
+ 1
13485
+ 1
13486
+ 1
13487
+ 1
13488
+ 1
13489
+ 1
13490
+ 1
13491
+ 1
13492
+ 1
13493
+ 1
13494
+ 1
13495
+ 1
13496
+ 1
13497
+ 1
13498
+ 1
13499
+ 1
13500
+ 1
13501
+ 1
13502
+ 1
13503
+ 1
13504
+ 1
13505
+ 1
13506
+ 1
13507
+ 1
13508
+ 1
13509
+ 1
13510
+ 1
13511
+ 1
13512
+ 1
13513
+ 1
13514
+ 1
13515
+ 1
13516
+ 1
13517
+ 1
13518
+ 1
13519
+ 1
13520
+ 1
13521
+ 1
13522
+ 1
13523
+ 1
13524
+ 1
13525
+ 1
13526
+ 1
13527
+ 1
13528
+ 1
13529
+ 1
13530
+ 1
13531
+ 1
13532
+ 1
13533
+ 1
13534
+ 1
13535
+ 1
13536
+ 1
13537
+ 1
13538
+ 1
13539
+ 1
13540
+ 1
13541
+ 1
13542
+ 1
13543
+ 1
13544
+ 1
13545
+ 1
13546
+ 1
13547
+ 1
13548
+ 1
13549
+ 1
13550
+ 1
13551
+ 1
13552
+ 1
13553
+ 1
13554
+ 1
13555
+ 1
13556
+ 1
13557
+ 1
13558
+ 1
13559
+ 1
13560
+ 1
13561
+ 1
13562
+ 1
13563
+ 1
13564
+ 1
13565
+ 1
13566
+ 1
13567
+ 1
13568
+ 1
13569
+ 1
13570
+ 1
13571
+ 1
13572
+ 1
13573
+ 1
13574
+ 1
13575
+ 1
13576
+ 1
13577
+ 1
13578
+ 1
13579
+ 1
13580
+ 1
13581
+ 1
13582
+ 1
13583
+ 1
13584
+ 1
13585
+ 1
13586
+ 1
13587
+ 1
13588
+ 1
13589
+ 1
13590
+ 1
13591
+ 1
13592
+ 1
13593
+ 1
13594
+ 1
13595
+ 1
13596
+ 1
13597
+ 1
13598
+ 1
13599
+ 1
13600
+ 1
13601
+ 1
13602
+ 1
13603
+ 1
13604
+ 1
13605
+ 1
13606
+ 1
13607
+ 1
13608
+ 1
13609
+ 1
13610
+ 1
13611
+ 1
13612
+ 1
13613
+ 1
13614
+ 1
13615
+ 1
13616
+ 1
13617
+ 1
13618
+ 1
13619
+ 1
13620
+ 1
13621
+ 1
13622
+ 1
13623
+ 1
13624
+ 1
13625
+ 1
13626
+ 1
13627
+ 1
13628
+ 1
13629
+ 1
13630
+ 1
13631
+ 1
13632
+ 1
13633
+ 1
13634
+ 1
13635
+ 1
13636
+ 1
13637
+ 1
13638
+ 1
13639
+ 1
13640
+ 1
13641
+ 1
13642
+ 1
13643
+ 1
13644
+ 1
13645
+ 1
13646
+ 1
13647
+ 1
13648
+ 1
13649
+ 1
13650
+ 1
13651
+ 1
13652
+ 1
13653
+ 1
13654
+ 1
13655
+ 1
13656
+ 1
13657
+ 1
13658
+ 1
13659
+ 1
13660
+ 1
13661
+ 1
13662
+ 1
13663
+ 1
13664
+ 1
13665
+ 1
13666
+ 1
13667
+ 1
13668
+ 1
13669
+ 1
13670
+ 1
13671
+ 1
13672
+ 1
13673
+ 1
13674
+ 1
13675
+ 1
13676
+ 1
13677
+ 1
13678
+ 1
13679
+ 1
13680
+ 1
13681
+ 1
13682
+ 1
13683
+ 1
13684
+ 1
13685
+ 1
13686
+ 1
13687
+ 1
13688
+ 1
13689
+ 1
13690
+ 1
13691
+ 1
13692
+ 1
13693
+ 1
13694
+ 1
13695
+ 1
13696
+ 1
13697
+ 1
13698
+ 1
13699
+ 1
13700
+ 1
13701
+ 1
13702
+ 1
13703
+ 1
13704
+ 1
13705
+ 1
13706
+ 1
13707
+ 1
13708
+ 1
13709
+ 1
13710
+ 1
13711
+ 1
13712
+ 1
13713
+ 1
13714
+ 1
13715
+ 1
13716
+ 1
13717
+ 1
13718
+ 2
13719
+ 1
13720
+ 1
13721
+ 1
13722
+ 1
13723
+ 1
13724
+ 1
13725
+ 1
13726
+ 1
13727
+ 1
13728
+ 1
13729
+ 1
13730
+ 1
13731
+ 1
13732
+ 1
13733
+ 1
13734
+ 1
13735
+ 1
13736
+ 1
13737
+ 1
13738
+ 1
13739
+ 1
13740
+ 1
13741
+ 1
13742
+ 1
13743
+ 1
13744
+ 1
13745
+ 1
13746
+ 1
13747
+ 1
13748
+ 1
13749
+ 1
13750
+ 1
13751
+ 1
13752
+ 1
13753
+ 1
13754
+ 1
13755
+ 1
13756
+ 1
13757
+ 1
13758
+ 1
13759
+ 1
13760
+ 1
13761
+ 1
13762
+ 1
13763
+ 1
13764
+ 1
13765
+ 1
13766
+ 1
13767
+ 1
13768
+ 1
13769
+ 1
13770
+ 1
13771
+ 1
13772
+ 1
13773
+ 1
13774
+ 1
13775
+ 1
13776
+ 1
13777
+ 1
13778
+ 1
13779
+ 1
13780
+ 1
13781
+ 1
13782
+ 1
13783
+ 1
13784
+ 1
13785
+ 1
13786
+ 1
13787
+ 1
13788
+ 1
13789
+ 1
13790
+ 1
13791
+ 1
13792
+ 1
13793
+ 1
13794
+ 1
13795
+ 1
13796
+ 1
13797
+ 1
13798
+ 1
13799
+ 1
13800
+ 1
13801
+ 1
13802
+ 1
13803
+ 1
13804
+ 1
13805
+ 1
13806
+ 1
13807
+ 1
13808
+ 1
13809
+ 1
13810
+ 1
13811
+ 1
13812
+ 1
13813
+ 1
13814
+ 1
13815
+ 1
13816
+ 1
13817
+ 1
13818
+ 1
13819
+ 1
13820
+ 1
13821
+ 1
13822
+ 1
13823
+ 1
13824
+ 1
13825
+ 1
13826
+ 1
13827
+ 1
13828
+ 1
13829
+ 1
13830
+ 1
13831
+ 1
13832
+ 1
13833
+ 1
13834
+ 1
13835
+ 1
13836
+ 1
13837
+ 1
13838
+ 1
13839
+ 1
13840
+ 1
13841
+ 1
13842
+ 1
13843
+ 1
13844
+ 1
13845
+ 1
13846
+ 1
13847
+ 1
13848
+ 1
13849
+ 1
13850
+ 1
13851
+ 1
13852
+ 1
13853
+ 1
13854
+ 1
13855
+ 1
13856
+ 1
13857
+ 1
13858
+ 1
13859
+ 1
13860
+ 1
13861
+ 1
13862
+ 1
13863
+ 1
13864
+ 1
13865
+ 1
13866
+ 1
13867
+ 1
13868
+ 1
13869
+ 1
13870
+ 1
13871
+ 1
13872
+ 1
13873
+ 1
13874
+ 1
13875
+ 1
13876
+ 1
13877
+ 1
13878
+ 1
13879
+ 1
13880
+ 1
13881
+ 1
13882
+ 1
13883
+ 1
13884
+ 1
13885
+ 1
13886
+ 1
13887
+ 1
13888
+ 1
13889
+ 1
13890
+ 1
13891
+ 1
13892
+ 1
13893
+ 1
13894
+ 1
13895
+ 1
13896
+ 1
13897
+ 1
13898
+ 1
13899
+ 1
13900
+ 1
13901
+ 1
13902
+ 1
13903
+ 1
13904
+ 1
13905
+ 1
13906
+ 1
13907
+ 1
13908
+ 1
13909
+ 1
13910
+ 1
13911
+ 1
13912
+ 1
13913
+ 1
13914
+ 1
13915
+ 1
13916
+ 1
13917
+ 1
13918
+ 1
13919
+ 1
13920
+ 1
13921
+ 1
13922
+ 1
13923
+ 1
13924
+ 1
13925
+ 1
13926
+ 1
13927
+ 1
13928
+ 1
13929
+ 1
13930
+ 1
13931
+ 1
13932
+ 1
13933
+ 1
13934
+ 1
13935
+ 1
13936
+ 1
13937
+ 1
13938
+ 1
13939
+ 1
13940
+ 1
13941
+ 1
13942
+ 1
13943
+ 1
13944
+ 1
13945
+ 1
13946
+ 1
13947
+ 1
13948
+ 1
13949
+ 1
13950
+ 1
13951
+ 1
13952
+ 1
13953
+ 1
13954
+ 1
13955
+ 1
13956
+ 1
13957
+ 1
13958
+ 1
13959
+ 1
13960
+ 1
13961
+ 1
13962
+ 1
13963
+ 1
13964
+ 1
13965
+ 1
13966
+ 1
13967
+ 1
13968
+ 1
13969
+ 1
13970
+ 1
13971
+ 1
13972
+ 1
13973
+ 1
13974
+ 1
13975
+ 1
13976
+ 1
13977
+ 1
13978
+ 1
13979
+ 1
13980
+ 1
13981
+ 1
13982
+ 1
13983
+ 1
13984
+ 1
13985
+ 1
13986
+ 1
13987
+ 1
13988
+ 1
13989
+ 1
13990
+ 1
13991
+ 1
13992
+ 1
13993
+ 1
13994
+ 1
13995
+ 1
13996
+ 1
13997
+ 1
13998
+ 1
13999
+ 1
14000
+ 1
14001
+ 1
14002
+ 1
14003
+ 1
14004
+ 1
14005
+ 1
14006
+ 1
14007
+ 1
14008
+ 1
14009
+ 1
14010
+ 1
14011
+ 1
14012
+ 1
14013
+ 1
14014
+ 1
14015
+ 1
14016
+ 1
14017
+ 1
14018
+ 1
14019
+ 1
14020
+ 1
14021
+ 1
14022
+ 1
14023
+ 1
14024
+ 1
14025
+ 1
14026
+ 1
14027
+ 1
14028
+ 1
14029
+ 1
14030
+ 1
14031
+ 1
14032
+ 1
14033
+ 1
14034
+ 1
14035
+ 1
14036
+ 1
14037
+ 1
14038
+ 1
14039
+ 1
14040
+ 1
14041
+ 1
14042
+ 1
14043
+ 1
14044
+ 1
14045
+ 1
14046
+ 1
14047
+ 1
14048
+ 1
14049
+ 1
14050
+ 1
14051
+ 1
14052
+ 1
14053
+ 1
14054
+ 1
14055
+ 1
14056
+ 1
14057
+ 1
14058
+ 1
14059
+ 1
14060
+ 1
14061
+ 1
14062
+ 1
14063
+ 1
14064
+ 1
14065
+ 1
14066
+ 1
14067
+ 1
14068
+ 1
14069
+ 1
14070
+ 1
14071
+ 1
14072
+ 1
14073
+ 1
14074
+ 1
14075
+ 1
14076
+ 1
14077
+ 1
14078
+ 1
14079
+ 1
14080
+ 1
14081
+ 1
14082
+ 1
14083
+ 1
14084
+ 1
14085
+ 1
14086
+ 1
14087
+ 1
14088
+ 1
14089
+ 1
14090
+ 1
14091
+ 1
14092
+ 1
14093
+ 1
14094
+ 1
14095
+ 1
14096
+ 1
14097
+ 1
14098
+ 1
14099
+ 1
14100
+ 1
14101
+ 1
14102
+ 1
14103
+ 1
14104
+ 1
14105
+ 1
14106
+ 1
14107
+ 1
14108
+ 1
14109
+ 1
14110
+ 1
14111
+ 1
14112
+ 1
14113
+ 1
14114
+ 1
14115
+ 1
14116
+ 1
14117
+ 1
14118
+ 1
14119
+ 1
14120
+ 1
14121
+ 1
14122
+ 1
14123
+ 1
14124
+ 1
14125
+ 1
14126
+ 1
14127
+ 1
14128
+ 1
14129
+ 1
14130
+ 1
14131
+ 1
14132
+ 1
14133
+ 1
14134
+ 1
14135
+ 1
14136
+ 1
14137
+ 1
14138
+ 1
14139
+ 1
14140
+ 1
14141
+ 1
14142
+ 1
14143
+ 1
14144
+ 1
14145
+ 1
14146
+ 1
14147
+ 1
14148
+ 1
14149
+ 1
14150
+ 1
14151
+ 1
14152
+ 1
14153
+ 1
14154
+ 1
14155
+ 1
14156
+ 1
14157
+ 1
14158
+ 1
14159
+ 1
14160
+ 1
14161
+ 1
14162
+ 1
14163
+ 1
14164
+ 1
14165
+ 1
14166
+ 1
14167
+ 1
14168
+ 1
14169
+ 1
14170
+ 1
14171
+ 1
14172
+ 1
14173
+ 1
14174
+ 1
14175
+ 1
14176
+ 1
14177
+ 1
14178
+ 1
14179
+ 1
14180
+ 1
14181
+ 1
14182
+ 1
14183
+ 1
14184
+ 1
14185
+ 1
14186
+ 1
14187
+ 1
14188
+ 1
14189
+ 1
14190
+ 1
14191
+ 1
14192
+ 1
14193
+ 1
14194
+ 1
14195
+ 1
14196
+ 1
14197
+ 1
14198
+ 1
14199
+ 1
14200
+ 1
14201
+ 1
14202
+ 1
14203
+ 1
14204
+ 1
14205
+ 1
14206
+ 1
14207
+ 1
14208
+ 1
14209
+ 1
14210
+ 1
14211
+ 1
14212
+ 1
14213
+ 1
14214
+ 1
14215
+ 1
14216
+ 1
14217
+ 1
14218
+ 1
14219
+ 1
14220
+ 1
14221
+ 1
14222
+ 1
14223
+ 1
14224
+ 1
14225
+ 1
14226
+ 1
14227
+ 1
14228
+ 1
14229
+ 1
14230
+ 1
14231
+ 1
14232
+ 1
14233
+ 1
14234
+ 1
14235
+ 1
14236
+ 1
14237
+ 1
14238
+ 1
14239
+ 1
14240
+ 1
14241
+ 1
14242
+ 1
14243
+ 1
14244
+ 1
14245
+ 1
14246
+ 1
14247
+ 1
14248
+ 1
14249
+ 1
14250
+ 1
14251
+ 1
14252
+ 1
14253
+ 1
14254
+ 1
14255
+ 1
14256
+ 1
14257
+ 1
14258
+ 1
14259
+ 1
14260
+ 1
14261
+ 1
14262
+ 1
14263
+ 1
14264
+ 1
14265
+ 1
14266
+ 1
14267
+ 1
14268
+ 1
14269
+ 1
14270
+ 1
14271
+ 1
14272
+ 1
14273
+ 1
14274
+ 1
14275
+ 1
14276
+ 1
14277
+ 1
14278
+ 1
14279
+ 1
14280
+ 1
14281
+ 1
14282
+ 1
14283
+ 1
14284
+ 1
14285
+ 1
14286
+ 1
14287
+ 1
14288
+ 1
14289
+ 1
14290
+ 1
14291
+ 1
14292
+ 1
14293
+ 1
14294
+ 1
14295
+ 1
14296
+ 1
14297
+ 1
14298
+ 1
14299
+ 1
14300
+ 1
14301
+ 1
14302
+ 1
14303
+ 1
14304
+ 1
14305
+ 1
14306
+ 1
14307
+ 1
14308
+ 1
14309
+ 1
14310
+ 1
14311
+ 1
14312
+ 1
14313
+ 1
14314
+ 1
14315
+ 1
14316
+ 1
14317
+ 1
14318
+ 1
14319
+ 1
14320
+ 1
14321
+ 1
14322
+ 1
14323
+ 1
14324
+ 1
14325
+ 1
14326
+ 1
14327
+ 1
14328
+ 1
14329
+ 1
14330
+ 1
14331
+ 1
14332
+ 1
14333
+ 1
14334
+ 1
14335
+ 1
14336
+ 1
14337
+ 1
14338
+ 1
14339
+ 1
14340
+ 1
14341
+ 1
14342
+ 1
14343
+ 1
14344
+ 1
14345
+ 1
14346
+ 1
14347
+ 1
14348
+ 1
14349
+ 1
14350
+ 1
14351
+ 1
14352
+ 1
14353
+ 1
14354
+ 1
14355
+ 1
14356
+ 1
14357
+ 1
14358
+ 1
14359
+ 1
14360
+ 1
14361
+ 1
14362
+ 1
14363
+ 1
14364
+ 1
14365
+ 1
14366
+ 1
14367
+ 1
14368
+ 1
14369
+ 1
14370
+ 1
14371
+ 1
14372
+ 1
14373
+ 1
14374
+ 1
14375
+ 1
14376
+ 1
14377
+ 1
14378
+ 1
14379
+ 1
14380
+ 1
14381
+ 1
14382
+ 1
14383
+ 1
14384
+ 1
14385
+ 1
14386
+ 1
14387
+ 1
14388
+ 1
14389
+ 1
14390
+ 1
14391
+ 1
14392
+ 1
14393
+ 1
14394
+ 1
14395
+ 1
14396
+ 1
14397
+ 1
14398
+ 1
14399
+ 1
14400
+ 1
14401
+ 1
14402
+ 1
14403
+ 1
14404
+ 1
14405
+ 1
14406
+ 1
14407
+ 1
14408
+ 1
14409
+ 1
14410
+ 1
14411
+ 1
14412
+ 1
14413
+ 1
14414
+ 1
14415
+ 1
14416
+ 1
14417
+ 1
14418
+ 1
14419
+ 1
14420
+ 1
14421
+ 1
14422
+ 1
14423
+ 1
14424
+ 1
14425
+ 1
14426
+ 1
14427
+ 1
14428
+ 1
14429
+ 1
14430
+ 1
14431
+ 1
14432
+ 1
14433
+ 1
14434
+ 1
14435
+ 1
14436
+ 1
14437
+ 1
14438
+ 1
14439
+ 1
14440
+ 1
14441
+ 1
14442
+ 1
14443
+ 1
14444
+ 1
14445
+ 1
14446
+ 1
14447
+ 1
14448
+ 1
14449
+ 1
14450
+ 1
14451
+ 1
14452
+ 1
14453
+ 1
14454
+ 1
14455
+ 1
14456
+ 1
14457
+ 1
14458
+ 1
14459
+ 1
14460
+ 1
14461
+ 1
14462
+ 1
14463
+ 1
14464
+ 1
14465
+ 1
14466
+ 1
14467
+ 1
14468
+ 1
14469
+ 1
14470
+ 1
14471
+ 1
14472
+ 1
14473
+ 1
14474
+ 1
14475
+ 1
14476
+ 1
14477
+ 1
14478
+ 1
14479
+ 1
14480
+ 1
14481
+ 1
14482
+ 1
14483
+ 1
14484
+ 1
14485
+ 1
14486
+ 1
14487
+ 1
14488
+ 1
14489
+ 1
14490
+ 1
14491
+ 1
14492
+ 1
14493
+ 1
14494
+ 1
14495
+ 1
14496
+ 1
14497
+ 1
14498
+ 1
14499
+ 1
14500
+ 2
14501
+ 1
14502
+ 1
14503
+ 1
14504
+ 1
14505
+ 1
14506
+ 1
14507
+ 1
14508
+ 1
14509
+ 1
14510
+ 1
14511
+ 1
14512
+ 1
14513
+ 1
14514
+ 1
14515
+ 1
14516
+ 1
14517
+ 1
14518
+ 2
14519
+ 1
14520
+ 1
14521
+ 1
14522
+ 1
14523
+ 1
14524
+ 1
14525
+ 1
14526
+ 1
14527
+ 1
14528
+ 1
14529
+ 1
14530
+ 1
14531
+ 1
14532
+ 1
14533
+ 1
14534
+ 1
14535
+ 1
14536
+ 1
14537
+ 1
14538
+ 1
14539
+ 1
14540
+ 1
14541
+ 1
14542
+ 1
14543
+ 1
14544
+ 1
14545
+ 1
14546
+ 1
14547
+ 1
14548
+ 1
14549
+ 1
14550
+ 1
14551
+ 1
14552
+ 1
14553
+ 1
14554
+ 1
14555
+ 1
14556
+ 1
14557
+ 1
14558
+ 1
14559
+ 1
14560
+ 1
14561
+ 1
14562
+ 1
14563
+ 1
14564
+ 1
14565
+ 1
14566
+ 1
14567
+ 1
14568
+ 1
14569
+ 1
14570
+ 1
14571
+ 1
14572
+ 1
14573
+ 1
14574
+ 1
14575
+ 1
14576
+ 1
14577
+ 1
14578
+ 1
14579
+ 1
14580
+ 1
14581
+ 1
14582
+ 1
14583
+ 1
14584
+ 1
14585
+ 1
14586
+ 1
14587
+ 1
14588
+ 1
14589
+ 1
14590
+ 1
14591
+ 1
14592
+ 1
14593
+ 1
14594
+ 1
14595
+ 1
14596
+ 1
14597
+ 1
14598
+ 1
14599
+ 1
14600
+ 1
14601
+ 1
14602
+ 1
14603
+ 1
14604
+ 1
14605
+ 1
14606
+ 1
14607
+ 1
14608
+ 1
14609
+ 1
14610
+ 1
14611
+ 1
14612
+ 1
14613
+ 1
14614
+ 1
14615
+ 1
14616
+ 1
14617
+ 1
14618
+ 1
14619
+ 1
14620
+ 1
14621
+ 1
14622
+ 1
14623
+ 1
14624
+ 1
14625
+ 1
14626
+ 1
14627
+ 1
14628
+ 1
14629
+ 1
14630
+ 1
14631
+ 1
14632
+ 1
14633
+ 1
14634
+ 1
14635
+ 1
14636
+ 1
14637
+ 1
14638
+ 1
14639
+ 1
14640
+ 1
14641
+ 1
14642
+ 1
14643
+ 1
14644
+ 1
14645
+ 1
14646
+ 1
14647
+ 1
14648
+ 1
14649
+ 1
14650
+ 1
14651
+ 1
14652
+ 1
14653
+ 1
14654
+ 1
14655
+ 1
14656
+ 1
14657
+ 1
14658
+ 1
14659
+ 1
14660
+ 1
14661
+ 1
14662
+ 1
14663
+ 1
14664
+ 1
14665
+ 1
14666
+ 1
14667
+ 1
14668
+ 1
14669
+ 1
14670
+ 1
14671
+ 1
14672
+ 1
14673
+ 1
14674
+ 1
14675
+ 1
14676
+ 1
14677
+ 1
14678
+ 1
14679
+ 1
14680
+ 1
14681
+ 1
14682
+ 1
14683
+ 1
14684
+ 1
14685
+ 1
14686
+ 1
14687
+ 1
14688
+ 1
14689
+ 1
14690
+ 1
14691
+ 1
14692
+ 1
14693
+ 1
14694
+ 1
14695
+ 1
14696
+ 1
14697
+ 1
14698
+ 1
14699
+ 1
14700
+ 1
14701
+ 1
14702
+ 1
14703
+ 1
14704
+ 1
14705
+ 1
14706
+ 1
14707
+ 1
14708
+ 1
14709
+ 1
14710
+ 1
14711
+ 1
14712
+ 1
14713
+ 1
14714
+ 1
14715
+ 1
14716
+ 1
14717
+ 1
14718
+ 1
14719
+ 1
14720
+ 1
14721
+ 1
14722
+ 1
14723
+ 1
14724
+ 1
14725
+ 1
14726
+ 1
14727
+ 1
14728
+ 1
14729
+ 1
14730
+ 1
14731
+ 1
14732
+ 1
14733
+ 1
14734
+ 1
14735
+ 1
14736
+ 1
14737
+ 1
14738
+ 1
14739
+ 1
14740
+ 1
14741
+ 1
14742
+ 1
14743
+ 1
14744
+ 1
14745
+ 1
14746
+ 1
14747
+ 1
14748
+ 1
14749
+ 1
14750
+ 1
14751
+ 1
14752
+ 1
14753
+ 1
14754
+ 1
14755
+ 1
14756
+ 1
14757
+ 1
14758
+ 1
14759
+ 1
14760
+ 1
14761
+ 1
14762
+ 1
14763
+ 1
14764
+ 1
14765
+ 1
14766
+ 1
14767
+ 1
14768
+ 1
14769
+ 1
14770
+ 1
14771
+ 1
14772
+ 1
14773
+ 1
14774
+ 1
14775
+ 1
14776
+ 2
14777
+ 1
14778
+ 1
14779
+ 1
14780
+ 1
14781
+ 1
14782
+ 1
14783
+ 1
14784
+ 1
14785
+ 1
14786
+ 1
14787
+ 1
14788
+ 1
14789
+ 1
14790
+ 1
14791
+ 1
14792
+ 1
14793
+ 1
14794
+ 1
14795
+ 1
14796
+ 1
14797
+ 1
14798
+ 1
14799
+ 1
14800
+ 1
14801
+ 1
14802
+ 1
14803
+ 1
14804
+ 1
14805
+ 1
14806
+ 1
14807
+ 1
14808
+ 1
14809
+ 1
14810
+ 1
14811
+ 1
14812
+ 1
14813
+ 1
14814
+ 1
14815
+ 1
14816
+ 1
14817
+ 1
14818
+ 1
14819
+ 1
14820
+ 1
14821
+ 1
14822
+ 1
14823
+ 1
14824
+ 1
14825
+ 1
14826
+ 1
14827
+ 1
14828
+ 1
14829
+ 1
14830
+ 1
14831
+ 1
14832
+ 1
14833
+ 1
14834
+ 1
14835
+ 1
14836
+ 1
14837
+ 1
14838
+ 1
14839
+ 1
14840
+ 1
14841
+ 1
14842
+ 1
14843
+ 1
14844
+ 1
14845
+ 1
14846
+ 1
14847
+ 1
14848
+ 1
14849
+ 1
14850
+ 1
14851
+ 1
14852
+ 1
14853
+ 1
14854
+ 1
14855
+ 1
14856
+ 1
14857
+ 1
14858
+ 1
14859
+ 1
14860
+ 1
14861
+ 1
14862
+ 1
14863
+ 1
14864
+ 1
14865
+ 1
14866
+ 1
14867
+ 1
14868
+ 1
14869
+ 1
14870
+ 1
14871
+ 1
14872
+ 1
14873
+ 1
14874
+ 1
14875
+ 1
14876
+ 1
14877
+ 1
14878
+ 1
14879
+ 1
14880
+ 1
14881
+ 1
14882
+ 1
14883
+ 1
14884
+ 1
14885
+ 1
14886
+ 1
14887
+ 1
14888
+ 1
14889
+ 1
14890
+ 1
14891
+ 1
14892
+ 1
14893
+ 1
14894
+ 1
14895
+ 1
14896
+ 1
14897
+ 1
14898
+ 1
14899
+ 1
14900
+ 1
14901
+ 1
14902
+ 1
14903
+ 1
14904
+ 1
14905
+ 1
14906
+ 1
14907
+ 1
14908
+ 1
14909
+ 1
14910
+ 1
14911
+ 1
14912
+ 1
14913
+ 1
14914
+ 1
14915
+ 1
14916
+ 1
14917
+ 1
14918
+ 1
14919
+ 1
14920
+ 1
14921
+ 1
14922
+ 1
14923
+ 1
14924
+ 1
14925
+ 1
14926
+ 1
14927
+ 1
14928
+ 1
14929
+ 1
14930
+ 1
14931
+ 1
14932
+ 1
14933
+ 1
14934
+ 1
14935
+ 1
14936
+ 1
14937
+ 1
14938
+ 1
14939
+ 1
14940
+ 1
14941
+ 1
14942
+ 1
14943
+ 1
14944
+ 1
14945
+ 1
14946
+ 1
14947
+ 1
14948
+ 1
14949
+ 1
14950
+ 1
14951
+ 1
14952
+ 1
14953
+ 1
14954
+ 1
14955
+ 1
14956
+ 1
14957
+ 1
14958
+ 1
14959
+ 1
14960
+ 1
14961
+ 1
14962
+ 1
14963
+ 1
14964
+ 1
14965
+ 1
14966
+ 1
14967
+ 1
14968
+ 1
14969
+ 1
14970
+ 1
14971
+ 1
14972
+ 1
14973
+ 1
14974
+ 1
14975
+ 1
14976
+ 1
14977
+ 1
14978
+ 1
14979
+ 1
14980
+ 1
14981
+ 1
14982
+ 1
14983
+ 1
14984
+ 1
14985
+ 1
14986
+ 1
14987
+ 1
14988
+ 1
14989
+ 1
14990
+ 1
14991
+ 1
14992
+ 1
14993
+ 1
14994
+ 1
14995
+ 1
14996
+ 1
14997
+ 1
14998
+ 1
14999
+ 1
15000
+ 1
15001
+ 1
15002
+ 1
15003
+ 1
15004
+ 1
15005
+ 1
15006
+ 1
15007
+ 1
15008
+ 1
15009
+ 1
15010
+ 1
15011
+ 1
15012
+ 1
15013
+ 1
15014
+ 1
15015
+ 1
15016
+ 1
15017
+ 1
15018
+ 1
15019
+ 1
15020
+ 1
15021
+ 1
15022
+ 1
15023
+ 1
15024
+ 1
15025
+ 1
15026
+ 1
15027
+ 1
15028
+ 1
15029
+ 1
15030
+ 1
15031
+ 1
15032
+ 1
15033
+ 1
15034
+ 1
15035
+ 1
15036
+ 1
15037
+ 1
15038
+ 1
15039
+ 1
15040
+ 1
15041
+ 1
15042
+ 1
15043
+ 1
15044
+ 1
15045
+ 1
15046
+ 1
15047
+ 1
15048
+ 1
15049
+ 1
15050
+ 1
15051
+ 1
15052
+ 1
15053
+ 1
15054
+ 1
15055
+ 1
15056
+ 1
15057
+ 1
15058
+ 1
15059
+ 1
15060
+ 1
15061
+ 1
15062
+ 1
15063
+ 1
15064
+ 1
15065
+ 1
15066
+ 1
15067
+ 1
15068
+ 1
15069
+ 1
15070
+ 1
15071
+ 1
15072
+ 1
15073
+ 1
15074
+ 1
15075
+ 1
15076
+ 1
15077
+ 1
15078
+ 1
15079
+ 1
15080
+ 1
15081
+ 1
15082
+ 1
15083
+ 1
15084
+ 1
15085
+ 1
15086
+ 1
15087
+ 1
15088
+ 1
15089
+ 1
15090
+ 1
15091
+ 1
15092
+ 1
15093
+ 1
15094
+ 1
15095
+ 1
15096
+ 1
15097
+ 1
15098
+ 1
15099
+ 1
15100
+ 1
15101
+ 1
15102
+ 1
15103
+ 1
15104
+ 1
15105
+ 1
15106
+ 1
15107
+ 1
15108
+ 1
15109
+ 1
15110
+ 1
15111
+ 1
15112
+ 1
15113
+ 1
15114
+ 1
15115
+ 1
15116
+ 1
15117
+ 1
15118
+ 1
15119
+ 1
15120
+ 1
15121
+ 1
15122
+ 1
15123
+ 1
15124
+ 1
15125
+ 1
15126
+ 1
15127
+ 1
15128
+ 1
15129
+ 1
15130
+ 1
15131
+ 1
15132
+ 1
15133
+ 1
15134
+ 1
15135
+ 1
15136
+ 1
15137
+ 1
15138
+ 1
15139
+ 1
15140
+ 1
15141
+ 1
15142
+ 1
15143
+ 1
15144
+ 1
15145
+ 1
15146
+ 1
15147
+ 1
15148
+ 1
15149
+ 1
15150
+ 1
15151
+ 1
15152
+ 1
15153
+ 1
15154
+ 1
15155
+ 1
15156
+ 1
15157
+ 1
15158
+ 1
15159
+ 1
15160
+ 1
15161
+ 1
15162
+ 1
15163
+ 1
15164
+ 1
15165
+ 1
15166
+ 1
15167
+ 1
15168
+ 1
15169
+ 1
15170
+ 1
15171
+ 1
15172
+ 1
15173
+ 1
15174
+ 1
15175
+ 1
15176
+ 1
15177
+ 1
15178
+ 1
15179
+ 1
15180
+ 1
15181
+ 1
15182
+ 1
15183
+ 1
15184
+ 1
15185
+ 1
15186
+ 1
15187
+ 1
15188
+ 1
15189
+ 1
15190
+ 1
15191
+ 1
15192
+ 1
15193
+ 1
15194
+ 1
15195
+ 1
15196
+ 1
15197
+ 1
15198
+ 1
15199
+ 1
15200
+ 1
15201
+ 1
15202
+ 1
15203
+ 1
15204
+ 1
15205
+ 1
15206
+ 1
15207
+ 1
15208
+ 1
15209
+ 1
15210
+ 1
15211
+ 1
15212
+ 1
15213
+ 1
15214
+ 1
15215
+ 1
15216
+ 1
15217
+ 1
15218
+ 1
15219
+ 1
15220
+ 1
15221
+ 1
15222
+ 1
15223
+ 1
15224
+ 1
15225
+ 1
15226
+ 1
15227
+ 1
15228
+ 1
15229
+ 1
15230
+ 1
15231
+ 1
15232
+ 1
15233
+ 1
15234
+ 1
15235
+ 1
15236
+ 1
15237
+ 1
15238
+ 1
15239
+ 1
15240
+ 1
15241
+ 1
15242
+ 1
15243
+ 1
15244
+ 1
15245
+ 1
15246
+ 1
15247
+ 1
15248
+ 1
15249
+ 1
15250
+ 1
15251
+ 1
15252
+ 1
15253
+ 1
15254
+ 1
15255
+ 1
15256
+ 1
15257
+ 1
15258
+ 1
15259
+ 1
15260
+ 1
15261
+ 1
15262
+ 1
15263
+ 1
15264
+ 1
15265
+ 1
15266
+ 1
15267
+ 1
15268
+ 1
15269
+ 1
15270
+ 1
15271
+ 1
15272
+ 1
15273
+ 1
15274
+ 1
15275
+ 1
15276
+ 1
15277
+ 1
15278
+ 1
15279
+ 1
15280
+ 1
15281
+ 1
15282
+ 1
15283
+ 1
15284
+ 1
15285
+ 1
15286
+ 1
15287
+ 1
15288
+ 1
15289
+ 1
15290
+ 1
15291
+ 1
15292
+ 1
15293
+ 1
15294
+ 1
15295
+ 1
15296
+ 1
15297
+ 1
15298
+ 2
15299
+ 1
15300
+ 1
15301
+ 1
15302
+ 1
15303
+ 1
15304
+ 1
15305
+ 1
15306
+ 1
15307
+ 1
15308
+ 1
15309
+ 1
15310
+ 1
15311
+ 1
15312
+ 1
15313
+ 1
15314
+ 1
15315
+ 1
15316
+ 1
15317
+ 1
15318
+ 1
15319
+ 1
15320
+ 1
15321
+ 1
15322
+ 1
15323
+ 1
15324
+ 1
15325
+ 1
15326
+ 1
15327
+ 1
15328
+ 1
15329
+ 1
15330
+ 1
15331
+ 1
15332
+ 1
15333
+ 1
15334
+ 1
15335
+ 1
15336
+ 1
15337
+ 1
15338
+ 1
15339
+ 1
15340
+ 1
15341
+ 1
15342
+ 1
15343
+ 1
15344
+ 1
15345
+ 1
15346
+ 1
15347
+ 1
15348
+ 1
15349
+ 1
15350
+ 1
15351
+ 1
15352
+ 1
15353
+ 1
15354
+ 1
15355
+ 1
15356
+ 1
15357
+ 1
15358
+ 1
15359
+ 1
15360
+ 1
15361
+ 1
15362
+ 1
15363
+ 1
15364
+ 1
15365
+ 1
15366
+ 1
15367
+ 1
15368
+ 1
15369
+ 1
15370
+ 1
15371
+ 1
15372
+ 1
15373
+ 1
15374
+ 1
15375
+ 1
15376
+ 1
15377
+ 1
15378
+ 1
15379
+ 1
15380
+ 1
15381
+ 1
15382
+ 1
15383
+ 1
15384
+ 1
15385
+ 1
15386
+ 1
15387
+ 1
15388
+ 1
15389
+ 1
15390
+ 1
15391
+ 1
15392
+ 1
15393
+ 1
15394
+ 1
15395
+ 1
15396
+ 1
15397
+ 1
15398
+ 1
15399
+ 1
15400
+ 1
15401
+ 1
15402
+ 1
15403
+ 1
15404
+ 1
15405
+ 1
15406
+ 1
15407
+ 1
15408
+ 1
15409
+ 1
15410
+ 1
15411
+ 1
15412
+ 1
15413
+ 1
15414
+ 1
15415
+ 1
15416
+ 1
15417
+ 1
15418
+ 1
15419
+ 1
15420
+ 1
15421
+ 1
15422
+ 1
15423
+ 1
15424
+ 1
15425
+ 1
15426
+ 1
15427
+ 1
15428
+ 1
15429
+ 1
15430
+ 1
15431
+ 1
15432
+ 1
15433
+ 1
15434
+ 1
15435
+ 1
15436
+ 1
15437
+ 1
15438
+ 1
15439
+ 1
15440
+ 1
15441
+ 1
15442
+ 1
15443
+ 1
15444
+ 1
15445
+ 1
15446
+ 1
15447
+ 1
15448
+ 1
15449
+ 1
15450
+ 1
15451
+ 1
15452
+ 1
15453
+ 1
15454
+ 1
15455
+ 1
15456
+ 1
15457
+ 1
15458
+ 1
15459
+ 1
15460
+ 1
15461
+ 1
15462
+ 1
15463
+ 1
15464
+ 1
15465
+ 1
15466
+ 1
15467
+ 1
15468
+ 1
15469
+ 1
15470
+ 1
15471
+ 1
15472
+ 1
15473
+ 1
15474
+ 1
15475
+ 1
15476
+ 1
15477
+ 1
15478
+ 1
15479
+ 1
15480
+ 1
15481
+ 1
15482
+ 1
15483
+ 1
15484
+ 1
15485
+ 1
15486
+ 1
15487
+ 1
15488
+ 1
15489
+ 1
15490
+ 1
15491
+ 1
15492
+ 1
15493
+ 1
15494
+ 1
15495
+ 1
15496
+ 1
15497
+ 1
15498
+ 1
15499
+ 1
15500
+ 1
15501
+ 1
15502
+ 1
15503
+ 1
15504
+ 1
15505
+ 1
15506
+ 1
15507
+ 1
15508
+ 1
15509
+ 1
15510
+ 1
15511
+ 1
15512
+ 1
15513
+ 1
15514
+ 1
15515
+ 1
15516
+ 1
15517
+ 1
15518
+ 1
15519
+ 1
15520
+ 1
15521
+ 1
15522
+ 1
15523
+ 1
15524
+ 1
15525
+ 1
15526
+ 1
15527
+ 1
15528
+ 1
15529
+ 1
15530
+ 1
15531
+ 1
15532
+ 1
15533
+ 1
15534
+ 1
15535
+ 1
15536
+ 1
15537
+ 1
15538
+ 1
15539
+ 1
15540
+ 1
15541
+ 1
15542
+ 1
15543
+ 1
15544
+ 1
15545
+ 1
15546
+ 1
15547
+ 1
15548
+ 1
15549
+ 1
15550
+ 1
15551
+ 1
15552
+ 1
15553
+ 1
15554
+ 1
15555
+ 1
15556
+ 1
15557
+ 2
15558
+ 1
15559
+ 1
15560
+ 1
15561
+ 1
15562
+ 1
15563
+ 1
15564
+ 1
15565
+ 1
15566
+ 1
15567
+ 1
15568
+ 1
15569
+ 1
15570
+ 1
15571
+ 1
15572
+ 1
15573
+ 1
15574
+ 1
15575
+ 1
15576
+ 1
15577
+ 1
15578
+ 1
15579
+ 1
15580
+ 1
15581
+ 1
15582
+ 1
15583
+ 1
15584
+ 1
15585
+ 1
15586
+ 1
15587
+ 1
15588
+ 1
15589
+ 1
15590
+ 1
15591
+ 1
15592
+ 1
15593
+ 1
15594
+ 1
15595
+ 1
15596
+ 1
15597
+ 1
15598
+ 1
15599
+ 1
15600
+ 1
15601
+ 1
15602
+ 1
15603
+ 1
15604
+ 1
15605
+ 1
15606
+ 1
15607
+ 1
15608
+ 1
15609
+ 1
15610
+ 1
15611
+ 1
15612
+ 1
15613
+ 1
15614
+ 1
15615
+ 1
15616
+ 1
15617
+ 1
15618
+ 1
15619
+ 1
15620
+ 1
15621
+ 1
15622
+ 1
15623
+ 1
15624
+ 1
15625
+ 1
15626
+ 1
15627
+ 1
15628
+ 1
15629
+ 1
15630
+ 1
15631
+ 1
15632
+ 1
15633
+ 1
15634
+ 1
15635
+ 1
15636
+ 1
15637
+ 1
15638
+ 1
15639
+ 1
15640
+ 1
15641
+ 1
15642
+ 1
15643
+ 1
15644
+ 1
15645
+ 1
15646
+ 1
15647
+ 1
15648
+ 1
15649
+ 1
15650
+ 1
15651
+ 1
15652
+ 1
15653
+ 1
15654
+ 1
15655
+ 1
15656
+ 1
15657
+ 1
15658
+ 1
15659
+ 1
15660
+ 1
15661
+ 1
15662
+ 1
15663
+ 1
15664
+ 1
15665
+ 1
15666
+ 1
15667
+ 1
15668
+ 1
15669
+ 1
15670
+ 1
15671
+ 1
15672
+ 1
15673
+ 1
15674
+ 1
15675
+ 1
15676
+ 1
15677
+ 1
15678
+ 1
15679
+ 1
15680
+ 1
15681
+ 1
15682
+ 1
15683
+ 1
15684
+ 1
15685
+ 1
15686
+ 1
15687
+ 1
15688
+ 1
15689
+ 1
15690
+ 1
15691
+ 1
15692
+ 1
15693
+ 1
15694
+ 1
15695
+ 1
15696
+ 1
15697
+ 1
15698
+ 1
15699
+ 1
15700
+ 1
15701
+ 1
15702
+ 1
15703
+ 1
15704
+ 1
15705
+ 1
15706
+ 1
15707
+ 1
15708
+ 1
15709
+ 1
15710
+ 1
15711
+ 1
15712
+ 1
15713
+ 1
15714
+ 1
15715
+ 1
15716
+ 1
15717
+ 1
15718
+ 1
15719
+ 1
15720
+ 1
15721
+ 1
15722
+ 1
15723
+ 1
15724
+ 1
15725
+ 1
15726
+ 1
15727
+ 1
15728
+ 1
15729
+ 1
15730
+ 1
15731
+ 1
15732
+ 1
15733
+ 1
15734
+ 1
15735
+ 1
15736
+ 1
15737
+ 1
15738
+ 1
15739
+ 1
15740
+ 1
15741
+ 1
15742
+ 1
15743
+ 1
15744
+ 1
15745
+ 1
15746
+ 1
15747
+ 1
15748
+ 1
15749
+ 1
15750
+ 1
15751
+ 1
15752
+ 1
15753
+ 1
15754
+ 1
15755
+ 1
15756
+ 1
15757
+ 1
15758
+ 1
15759
+ 1
15760
+ 1
15761
+ 1
15762
+ 1
15763
+ 1
15764
+ 1
15765
+ 1
15766
+ 1
15767
+ 1
15768
+ 1
15769
+ 1
15770
+ 1
15771
+ 1
15772
+ 1
15773
+ 1
15774
+ 1
15775
+ 1
15776
+ 1
15777
+ 1
15778
+ 1
15779
+ 1
15780
+ 1
15781
+ 1
15782
+ 1
15783
+ 1
15784
+ 1
15785
+ 1
15786
+ 1
15787
+ 1
15788
+ 1
15789
+ 1
15790
+ 1
15791
+ 1
15792
+ 1
15793
+ 1
15794
+ 1
15795
+ 1
15796
+ 1
15797
+ 1
15798
+ 1
15799
+ 1
15800
+ 1
15801
+ 1
15802
+ 1
15803
+ 1
15804
+ 1
15805
+ 1
15806
+ 1
15807
+ 1
15808
+ 1
15809
+ 1
15810
+ 1
15811
+ 1
15812
+ 1
15813
+ 1
15814
+ 1
15815
+ 1
15816
+ 1
15817
+ 1
15818
+ 1
15819
+ 1
15820
+ 1
15821
+ 1
15822
+ 1
15823
+ 1
15824
+ 1
15825
+ 1
15826
+ 1
15827
+ 1
15828
+ 1
15829
+ 1
15830
+ 1
15831
+ 1
15832
+ 1
15833
+ 1
15834
+ 1
15835
+ 2
15836
+ 1
15837
+ 1
15838
+ 1
15839
+ 1
15840
+ 2
15841
+ 1
15842
+ 1
15843
+ 1
15844
+ 1
15845
+ 1
15846
+ 1
15847
+ 1
15848
+ 1
15849
+ 1
15850
+ 1
15851
+ 1
15852
+ 1
15853
+ 1
15854
+ 1
15855
+ 1
15856
+ 1
15857
+ 1
15858
+ 1
15859
+ 1
15860
+ 1
15861
+ 1
15862
+ 1
15863
+ 1
15864
+ 1
15865
+ 1
15866
+ 1
15867
+ 1
15868
+ 1
15869
+ 1
15870
+ 1
15871
+ 1
15872
+ 1
15873
+ 1
15874
+ 1
15875
+ 1
15876
+ 1
15877
+ 1
15878
+ 1
15879
+ 1
15880
+ 1
15881
+ 1
15882
+ 1
15883
+ 1
15884
+ 1
15885
+ 1
15886
+ 1
15887
+ 1
15888
+ 1
15889
+ 1
15890
+ 1
15891
+ 1
15892
+ 1
15893
+ 1
15894
+ 1
15895
+ 1
15896
+ 1
15897
+ 1
15898
+ 1
15899
+ 1
15900
+ 1
15901
+ 1
15902
+ 1
15903
+ 1
15904
+ 1
15905
+ 1
15906
+ 1
15907
+ 1
15908
+ 1
15909
+ 1
15910
+ 1
15911
+ 1
15912
+ 1
15913
+ 1
15914
+ 1
15915
+ 1
15916
+ 1
15917
+ 1
15918
+ 1
15919
+ 1
15920
+ 1
15921
+ 1
15922
+ 1
15923
+ 1
15924
+ 1
15925
+ 1
15926
+ 1
15927
+ 1
15928
+ 1
15929
+ 1
15930
+ 1
15931
+ 1
15932
+ 1
15933
+ 1
15934
+ 1
15935
+ 1
15936
+ 1
15937
+ 1
15938
+ 1
15939
+ 1
15940
+ 1
15941
+ 1
15942
+ 1
15943
+ 1
15944
+ 1
15945
+ 1
15946
+ 1
15947
+ 1
15948
+ 1
15949
+ 1
15950
+ 1
15951
+ 1
15952
+ 1
15953
+ 1
15954
+ 1
15955
+ 1
15956
+ 1
15957
+ 1
15958
+ 1
15959
+ 1
15960
+ 1
15961
+ 1
15962
+ 1
15963
+ 1
15964
+ 1
15965
+ 1
15966
+ 1
15967
+ 1
15968
+ 1
15969
+ 1
15970
+ 1
15971
+ 1
15972
+ 1
15973
+ 1
15974
+ 1
15975
+ 1
15976
+ 1
15977
+ 1
15978
+ 1
15979
+ 1
15980
+ 1
15981
+ 1
15982
+ 1
15983
+ 1
15984
+ 1
15985
+ 1
15986
+ 1
15987
+ 1
15988
+ 1
15989
+ 1
15990
+ 1
15991
+ 1
15992
+ 1
15993
+ 1
15994
+ 1
15995
+ 1
15996
+ 1
15997
+ 1
15998
+ 1
15999
+ 1
16000
+ 1
16001
+ 1
16002
+ 1
16003
+ 1
16004
+ 1
16005
+ 1
16006
+ 1
16007
+ 1
16008
+ 1
16009
+ 1
16010
+ 1
16011
+ 1
16012
+ 1
16013
+ 1
16014
+ 1
16015
+ 1
16016
+ 1
16017
+ 1
16018
+ 1
16019
+ 1
16020
+ 1
16021
+ 1
16022
+ 1
16023
+ 1
16024
+ 1
16025
+ 1
16026
+ 1
16027
+ 1
16028
+ 1
16029
+ 1
16030
+ 1
16031
+ 1
16032
+ 1
16033
+ 1
16034
+ 1
16035
+ 1
16036
+ 1
16037
+ 1
16038
+ 1
16039
+ 1
16040
+ 1
16041
+ 1
16042
+ 1
16043
+ 1
16044
+ 1
16045
+ 1
16046
+ 1
16047
+ 1
16048
+ 1
16049
+ 1
16050
+ 1
16051
+ 1
16052
+ 1
16053
+ 1
16054
+ 1
16055
+ 1
16056
+ 1
16057
+ 1
16058
+ 1
16059
+ 1
16060
+ 1
16061
+ 1
16062
+ 1
16063
+ 1
16064
+ 1
16065
+ 1
16066
+ 1
16067
+ 1
16068
+ 1
16069
+ 1
16070
+ 1
16071
+ 1
16072
+ 1
16073
+ 1
16074
+ 1
16075
+ 1
16076
+ 1
16077
+ 1
16078
+ 1
16079
+ 1
16080
+ 1
16081
+ 1
16082
+ 1
16083
+ 1
16084
+ 1
16085
+ 1
16086
+ 1
16087
+ 1
16088
+ 1
16089
+ 1
16090
+ 1
16091
+ 1
16092
+ 1
16093
+ 1
16094
+ 1
16095
+ 1
16096
+ 1
16097
+ 1
16098
+ 1
16099
+ 1
16100
+ 1
16101
+ 1
16102
+ 1
16103
+ 1
16104
+ 1
16105
+ 1
16106
+ 1
16107
+ 1
16108
+ 1
16109
+ 1
16110
+ 1
16111
+ 1
16112
+ 1
16113
+ 1
16114
+ 1
16115
+ 1
16116
+ 1
16117
+ 1
16118
+ 1
16119
+ 1
16120
+ 1
16121
+ 1
16122
+ 1
16123
+ 1
16124
+ 1
16125
+ 1
16126
+ 1
16127
+ 2
16128
+ 2
16129
+ 1
16130
+ 1
16131
+ 1
16132
+ 1
16133
+ 1
16134
+ 1
16135
+ 1
16136
+ 1
16137
+ 1
16138
+ 1
16139
+ 1
16140
+ 1
16141
+ 1
16142
+ 1
16143
+ 1
16144
+ 1
16145
+ 1
16146
+ 1
16147
+ 1
16148
+ 1
16149
+ 1
16150
+ 1
16151
+ 1
16152
+ 1
16153
+ 1
16154
+ 1
16155
+ 1
16156
+ 1
16157
+ 1
16158
+ 1
16159
+ 1
16160
+ 1
16161
+ 1
16162
+ 1
16163
+ 1
16164
+ 1
16165
+ 1
16166
+ 1
16167
+ 1
16168
+ 1
16169
+ 1
16170
+ 1
16171
+ 1
16172
+ 1
16173
+ 1
16174
+ 1
16175
+ 1
16176
+ 1
16177
+ 1
16178
+ 1
16179
+ 1
16180
+ 1
16181
+ 1
16182
+ 1
16183
+ 1
16184
+ 1
16185
+ 1
16186
+ 1
16187
+ 1
16188
+ 1
16189
+ 1
16190
+ 1
16191
+ 1
16192
+ 1
16193
+ 1
16194
+ 1
16195
+ 1
16196
+ 1
16197
+ 1
16198
+ 1
16199
+ 1
16200
+ 1
16201
+ 1
16202
+ 1
16203
+ 1
16204
+ 1
16205
+ 1
16206
+ 1
16207
+ 1
16208
+ 1
16209
+ 1
16210
+ 1
16211
+ 1
16212
+ 1
16213
+ 1
16214
+ 1
16215
+ 1
16216
+ 1
16217
+ 1
16218
+ 1
16219
+ 1
16220
+ 1
16221
+ 1
16222
+ 1
16223
+ 1
16224
+ 1
16225
+ 1
16226
+ 1
16227
+ 1
16228
+ 1
16229
+ 1
16230
+ 1
16231
+ 1
16232
+ 1
16233
+ 1
16234
+ 1
16235
+ 1
16236
+ 1
16237
+ 1
16238
+ 1
16239
+ 1
16240
+ 1
16241
+ 1
16242
+ 1
16243
+ 1
16244
+ 1
16245
+ 1
16246
+ 1
16247
+ 1
16248
+ 1
16249
+ 1
16250
+ 1
16251
+ 1
16252
+ 1
16253
+ 1
16254
+ 1
16255
+ 1
16256
+ 1
16257
+ 1
16258
+ 1
16259
+ 1
16260
+ 1
16261
+ 1
16262
+ 1
16263
+ 1
16264
+ 1
16265
+ 1
16266
+ 1
16267
+ 1
16268
+ 1
16269
+ 1
16270
+ 1
16271
+ 1
16272
+ 1
16273
+ 1
16274
+ 1
16275
+ 1
16276
+ 1
16277
+ 1
16278
+ 1
16279
+ 1
16280
+ 1
16281
+ 1
16282
+ 1
16283
+ 1
16284
+ 1
16285
+ 1
16286
+ 1
16287
+ 1
16288
+ 1
16289
+ 1
16290
+ 1
16291
+ 1
16292
+ 1
16293
+ 1
16294
+ 1
16295
+ 1
16296
+ 1
16297
+ 1
16298
+ 1
16299
+ 1
16300
+ 1
16301
+ 1
16302
+ 1
16303
+ 1
16304
+ 1
16305
+ 1
16306
+ 1
16307
+ 1
16308
+ 1
16309
+ 1
16310
+ 1
16311
+ 1
16312
+ 1
16313
+ 1
16314
+ 1
16315
+ 1
16316
+ 1
16317
+ 1
16318
+ 1
16319
+ 1
16320
+ 1
16321
+ 1
16322
+ 1
16323
+ 1
16324
+ 1
16325
+ 1
16326
+ 1
16327
+ 1
16328
+ 1
16329
+ 1
16330
+ 1
16331
+ 1
16332
+ 1
16333
+ 1
16334
+ 1
16335
+ 1
16336
+ 1
16337
+ 1
16338
+ 1
16339
+ 1
16340
+ 1
16341
+ 1
16342
+ 1
16343
+ 1
16344
+ 1
16345
+ 1
16346
+ 1
16347
+ 1
16348
+ 1
16349
+ 1
16350
+ 1
16351
+ 1
16352
+ 1
16353
+ 1
16354
+ 1
16355
+ 1
16356
+ 1
16357
+ 1
16358
+ 1
16359
+ 1
16360
+ 1
16361
+ 1
16362
+ 1
16363
+ 1
16364
+ 1
16365
+ 1
16366
+ 1
16367
+ 1
16368
+ 1
16369
+ 1
16370
+ 1
16371
+ 1
16372
+ 1
16373
+ 1
16374
+ 1
16375
+ 1
16376
+ 1
16377
+ 1
16378
+ 1
16379
+ 1
16380
+ 1
16381
+ 1
16382
+ 1
16383
+ 1
16384
+ 1
16385
+ 1
16386
+ 1
16387
+ 2
16388
+ 1
16389
+ 1
16390
+ 1
16391
+ 1
16392
+ 1
16393
+ 1
16394
+ 1
16395
+ 1
16396
+ 1
16397
+ 1
16398
+ 1
16399
+ 1
16400
+ 1
16401
+ 1
16402
+ 1
16403
+ 1
16404
+ 1
16405
+ 1
16406
+ 1
16407
+ 1
16408
+ 1
16409
+ 1
16410
+ 1
16411
+ 1
16412
+ 1
16413
+ 1
16414
+ 1
16415
+ 1
16416
+ 1
16417
+ 1
16418
+ 1
16419
+ 1
16420
+ 1
16421
+ 1
16422
+ 1
16423
+ 1
16424
+ 1
16425
+ 1
16426
+ 1
16427
+ 1
16428
+ 1
16429
+ 1
16430
+ 1
16431
+ 1
16432
+ 1
16433
+ 1
16434
+ 1
16435
+ 1
16436
+ 1
16437
+ 1
16438
+ 1
16439
+ 1
16440
+ 1
16441
+ 1
16442
+ 1
16443
+ 1
16444
+ 1
16445
+ 1
16446
+ 1
16447
+ 1
16448
+ 1
16449
+ 1
16450
+ 1
16451
+ 1
16452
+ 1
16453
+ 1
16454
+ 1
16455
+ 1
16456
+ 1
16457
+ 1
16458
+ 1
16459
+ 1
16460
+ 1
16461
+ 1
16462
+ 1
16463
+ 1
16464
+ 1
16465
+ 1
16466
+ 1
16467
+ 1
16468
+ 1
16469
+ 1
16470
+ 1
16471
+ 1
16472
+ 1
16473
+ 1
16474
+ 1
16475
+ 1
16476
+ 1
16477
+ 1
16478
+ 1
16479
+ 1
16480
+ 1
16481
+ 1
16482
+ 1
16483
+ 1
16484
+ 1
16485
+ 1
16486
+ 1
16487
+ 1
16488
+ 1
16489
+ 1
16490
+ 1
16491
+ 1
16492
+ 1
16493
+ 1
16494
+ 1
16495
+ 1
16496
+ 1
16497
+ 1
16498
+ 1
16499
+ 1
16500
+ 1
16501
+ 1
16502
+ 1
16503
+ 1
16504
+ 1
16505
+ 1
16506
+ 1
16507
+ 1
16508
+ 1
16509
+ 1
16510
+ 1
16511
+ 1
16512
+ 1
16513
+ 1
16514
+ 1
16515
+ 1
16516
+ 1
16517
+ 1
16518
+ 1
16519
+ 1
16520
+ 1
16521
+ 1
16522
+ 1
16523
+ 1
16524
+ 1
16525
+ 1
16526
+ 1
16527
+ 1
16528
+ 1
16529
+ 1
16530
+ 1
16531
+ 1
16532
+ 1
16533
+ 1
16534
+ 1
16535
+ 1
16536
+ 1
16537
+ 1
16538
+ 1
16539
+ 1
16540
+ 1
16541
+ 1
16542
+ 1
16543
+ 1
16544
+ 1
16545
+ 1
16546
+ 1
16547
+ 1
16548
+ 1
16549
+ 1
16550
+ 1
16551
+ 1
16552
+ 1
16553
+ 1
16554
+ 1
16555
+ 1
16556
+ 1
16557
+ 1
16558
+ 1
16559
+ 1
16560
+ 1
16561
+ 1
16562
+ 1
16563
+ 1
16564
+ 1
16565
+ 1
16566
+ 1
16567
+ 1
16568
+ 1
16569
+ 1
16570
+ 1
16571
+ 1
16572
+ 1
16573
+ 1
16574
+ 1
16575
+ 1
16576
+ 1
16577
+ 1
16578
+ 1
16579
+ 1
16580
+ 1
16581
+ 1
16582
+ 1
16583
+ 1
16584
+ 1
16585
+ 1
16586
+ 1
16587
+ 1
16588
+ 1
16589
+ 1
16590
+ 1
16591
+ 1
16592
+ 1
16593
+ 1
16594
+ 1
16595
+ 1
16596
+ 1
16597
+ 1
16598
+ 1
16599
+ 1
16600
+ 1
16601
+ 1
16602
+ 1
16603
+ 1
16604
+ 1
16605
+ 1
16606
+ 1
16607
+ 1
16608
+ 1
16609
+ 1
16610
+ 1
16611
+ 1
16612
+ 1
16613
+ 1
16614
+ 1
16615
+ 1
16616
+ 1
16617
+ 1
16618
+ 1
16619
+ 1
16620
+ 1
16621
+ 1
16622
+ 1
16623
+ 1
16624
+ 1
16625
+ 1
16626
+ 1
16627
+ 1
16628
+ 1
16629
+ 1
16630
+ 1
16631
+ 1
16632
+ 1
16633
+ 1
16634
+ 2
16635
+ 1
16636
+ 1
16637
+ 1
16638
+ 1
16639
+ 1
16640
+ 1
16641
+ 1
16642
+ 1
16643
+ 1
16644
+ 1
16645
+ 2
16646
+ 1
16647
+ 1
16648
+ 1
16649
+ 1
16650
+ 1
16651
+ 1
16652
+ 2
16653
+ 1
16654
+ 1
16655
+ 1
16656
+ 1
16657
+ 1
16658
+ 1
16659
+ 1
16660
+ 1
16661
+ 1
16662
+ 1
16663
+ 1
16664
+ 1
16665
+ 1
16666
+ 1
16667
+ 1
16668
+ 1
16669
+ 1
16670
+ 1
16671
+ 1
16672
+ 1
16673
+ 1
16674
+ 1
16675
+ 1
16676
+ 1
16677
+ 1
16678
+ 1
16679
+ 1
16680
+ 1
16681
+ 1
16682
+ 1
16683
+ 1
16684
+ 1
16685
+ 1
16686
+ 1
16687
+ 1
16688
+ 1
16689
+ 1
16690
+ 1
16691
+ 1
16692
+ 1
16693
+ 1
16694
+ 1
16695
+ 1
16696
+ 1
16697
+ 1
16698
+ 1
16699
+ 1
16700
+ 1
16701
+ 1
16702
+ 1
16703
+ 1
16704
+ 1
16705
+ 1
16706
+ 1
16707
+ 1
16708
+ 1
16709
+ 1
16710
+ 1
16711
+ 1
16712
+ 1
16713
+ 1
16714
+ 1
16715
+ 1
16716
+ 1
16717
+ 1
16718
+ 1
16719
+ 1
16720
+ 1
16721
+ 1
16722
+ 1
16723
+ 1
16724
+ 1
16725
+ 1
16726
+ 1
16727
+ 1
16728
+ 1
16729
+ 1
16730
+ 1
16731
+ 1
16732
+ 1
16733
+ 1
16734
+ 1
16735
+ 1
16736
+ 1
16737
+ 1
16738
+ 1
16739
+ 1
16740
+ 1
16741
+ 1
16742
+ 1
16743
+ 1
16744
+ 1
16745
+ 1
16746
+ 1
16747
+ 1
16748
+ 1
16749
+ 1
16750
+ 1
16751
+ 1
16752
+ 1
16753
+ 1
16754
+ 1
16755
+ 1
16756
+ 1
16757
+ 1
16758
+ 1
16759
+ 1
16760
+ 1
16761
+ 1
16762
+ 1
16763
+ 1
16764
+ 1
16765
+ 1
16766
+ 1
16767
+ 1
16768
+ 1
16769
+ 1
16770
+ 1
16771
+ 1
16772
+ 1
16773
+ 1
16774
+ 1
16775
+ 1
16776
+ 1
16777
+ 1
16778
+ 1
16779
+ 1
16780
+ 1
16781
+ 1
16782
+ 1
16783
+ 1
16784
+ 1
16785
+ 1
16786
+ 1
16787
+ 1
16788
+ 1
16789
+ 1
16790
+ 1
16791
+ 1
16792
+ 1
16793
+ 1
16794
+ 1
16795
+ 1
16796
+ 1
16797
+ 1
16798
+ 1
16799
+ 1
16800
+ 1
16801
+ 1
16802
+ 1
16803
+ 1
16804
+ 1
16805
+ 1
16806
+ 1
16807
+ 1
16808
+ 1
16809
+ 1
16810
+ 1
16811
+ 1
16812
+ 1
16813
+ 1
16814
+ 1
16815
+ 1
16816
+ 1
16817
+ 1
16818
+ 1
16819
+ 1
16820
+ 1
16821
+ 1
16822
+ 1
16823
+ 1
16824
+ 1
16825
+ 1
16826
+ 1
16827
+ 1
16828
+ 1
16829
+ 1
16830
+ 1
16831
+ 1
16832
+ 1
16833
+ 1
16834
+ 1
16835
+ 1
16836
+ 1
16837
+ 1
16838
+ 1
16839
+ 1
16840
+ 1
16841
+ 1
16842
+ 1
16843
+ 1
16844
+ 1
16845
+ 1
16846
+ 1
16847
+ 1
16848
+ 1
16849
+ 1
16850
+ 1
16851
+ 1
16852
+ 1
16853
+ 1
16854
+ 1
16855
+ 1
16856
+ 1
16857
+ 1
16858
+ 1
16859
+ 1
16860
+ 1
16861
+ 1
16862
+ 1
16863
+ 1
16864
+ 1
16865
+ 1
16866
+ 1
16867
+ 1
16868
+ 1
16869
+ 1
16870
+ 1
16871
+ 1
16872
+ 1
16873
+ 1
16874
+ 1
16875
+ 1
16876
+ 1
16877
+ 1
16878
+ 1
16879
+ 1
16880
+ 1
16881
+ 1
16882
+ 1
16883
+ 1
16884
+ 1
16885
+ 1
16886
+ 1
16887
+ 1
16888
+ 1
16889
+ 1
16890
+ 1
16891
+ 1
16892
+ 1
16893
+ 1
16894
+ 1
16895
+ 1
16896
+ 1
16897
+ 1
16898
+ 1
16899
+ 1
16900
+ 1
16901
+ 1
16902
+ 1
16903
+ 1
16904
+ 1
16905
+ 1
16906
+ 1
16907
+ 1
16908
+ 1
16909
+ 1
16910
+ 1
16911
+ 1
16912
+ 1
16913
+ 1
16914
+ 1
16915
+ 1
16916
+ 1
16917
+ 1
16918
+ 1
16919
+ 1
16920
+ 1
16921
+ 1
16922
+ 1
16923
+ 1
16924
+ 1
16925
+ 1
16926
+ 1
16927
+ 1
16928
+ 1
16929
+ 1
16930
+ 1
16931
+ 1
16932
+ 1
16933
+ 1
16934
+ 1
16935
+ 1
16936
+ 1
16937
+ 1
16938
+ 1
16939
+ 1
16940
+ 1
16941
+ 1
16942
+ 1
16943
+ 1
16944
+ 1
16945
+ 1
16946
+ 1
16947
+ 1
16948
+ 1
16949
+ 1
16950
+ 1
16951
+ 1
16952
+ 1
16953
+ 1
16954
+ 1
16955
+ 1
16956
+ 1
16957
+ 1
16958
+ 1
16959
+ 1
16960
+ 1
16961
+ 1
16962
+ 1
16963
+ 1
16964
+ 1
16965
+ 1
16966
+ 1
16967
+ 1
16968
+ 1
16969
+ 1
16970
+ 1
16971
+ 1
16972
+ 1
16973
+ 1
16974
+ 1
16975
+ 1
16976
+ 1
16977
+ 1
16978
+ 1
16979
+ 1
16980
+ 1
16981
+ 1
16982
+ 1
16983
+ 1
16984
+ 1
16985
+ 1
16986
+ 1
16987
+ 1
16988
+ 1
16989
+ 1
16990
+ 1
16991
+ 1
16992
+ 1
16993
+ 1
16994
+ 1
16995
+ 1
16996
+ 1
16997
+ 1
16998
+ 1
16999
+ 1
17000
+ 1
17001
+ 1
17002
+ 1
17003
+ 1
17004
+ 1
17005
+ 1
17006
+ 1
17007
+ 1
17008
+ 1
17009
+ 1
17010
+ 1
17011
+ 1
17012
+ 1
17013
+ 1
17014
+ 1
17015
+ 1
17016
+ 1
17017
+ 1
17018
+ 1
17019
+ 1
17020
+ 1
17021
+ 1
17022
+ 1
17023
+ 1
17024
+ 1
17025
+ 1
17026
+ 1
17027
+ 1
17028
+ 1
17029
+ 1
17030
+ 1
17031
+ 1
17032
+ 1
17033
+ 1
17034
+ 1
17035
+ 1
17036
+ 1
17037
+ 1
17038
+ 1
17039
+ 1
17040
+ 1
17041
+ 1
17042
+ 1
17043
+ 1
17044
+ 1
17045
+ 1
17046
+ 1
17047
+ 1
17048
+ 1
17049
+ 1
17050
+ 1
17051
+ 1
17052
+ 1
17053
+ 1
17054
+ 1
17055
+ 1
17056
+ 1
17057
+ 1
17058
+ 1
17059
+ 1
17060
+ 1
17061
+ 1
17062
+ 1
17063
+ 1
17064
+ 1
17065
+ 1
17066
+ 1
17067
+ 1
17068
+ 1
17069
+ 1
17070
+ 1
17071
+ 1
17072
+ 1
17073
+ 1
17074
+ 1
17075
+ 1
17076
+ 1
17077
+ 1
17078
+ 1
17079
+ 1
17080
+ 1
17081
+ 1
17082
+ 1
17083
+ 1
17084
+ 1
17085
+ 1
17086
+ 1
17087
+ 1
17088
+ 1
17089
+ 1
17090
+ 1
17091
+ 1
17092
+ 1
17093
+ 1
17094
+ 1
17095
+ 1
17096
+ 1
17097
+ 1
17098
+ 1
17099
+ 1
17100
+ 1
17101
+ 1
17102
+ 1
17103
+ 1
17104
+ 1
17105
+ 1
17106
+ 1
17107
+ 1
17108
+ 1
17109
+ 1
17110
+ 1
17111
+ 1
17112
+ 1
17113
+ 1
17114
+ 1
17115
+ 1
17116
+ 1
17117
+ 1
17118
+ 1
17119
+ 1
17120
+ 1
17121
+ 1
17122
+ 1
17123
+ 1
17124
+ 1
17125
+ 1
17126
+ 1
17127
+ 1
17128
+ 1
17129
+ 1
17130
+ 1
17131
+ 1
17132
+ 1
17133
+ 1
17134
+ 1
17135
+ 1
17136
+ 1
17137
+ 1
17138
+ 1
17139
+ 1
17140
+ 1
17141
+ 1
17142
+ 1
17143
+ 1
17144
+ 1
17145
+ 1
17146
+ 1
17147
+ 1
17148
+ 1
17149
+ 1
17150
+ 1
17151
+ 1
17152
+ 1
17153
+ 1
17154
+ 1
17155
+ 1
17156
+ 1
17157
+ 1
17158
+ 1
17159
+ 1
17160
+ 1
17161
+ 1
17162
+ 1
17163
+ 1
17164
+ 1
17165
+ 1
17166
+ 1
17167
+ 2
17168
+ 1
17169
+ 1
17170
+ 2
17171
+ 1
17172
+ 1
17173
+ 1
17174
+ 1
17175
+ 1
17176
+ 1
17177
+ 1
17178
+ 1
17179
+ 1
17180
+ 1
17181
+ 1
17182
+ 1
17183
+ 1
17184
+ 1
17185
+ 1
17186
+ 1
17187
+ 1
17188
+ 1
17189
+ 1
17190
+ 1
17191
+ 1
17192
+ 1
17193
+ 1
17194
+ 1
17195
+ 1
17196
+ 1
17197
+ 1
17198
+ 1
17199
+ 1
17200
+ 1
17201
+ 1
17202
+ 1
17203
+ 1
17204
+ 1
17205
+ 1
17206
+ 1
17207
+ 1
17208
+ 1
17209
+ 1
17210
+ 1
17211
+ 1
17212
+ 1
17213
+ 1
17214
+ 1
17215
+ 1
17216
+ 1
17217
+ 1
17218
+ 1
17219
+ 1
17220
+ 1
17221
+ 1
17222
+ 1
17223
+ 1
17224
+ 1
17225
+ 1
17226
+ 1
17227
+ 1
17228
+ 1
17229
+ 1
17230
+ 1
17231
+ 1
17232
+ 1
17233
+ 1
17234
+ 1
17235
+ 1
17236
+ 1
17237
+ 1
17238
+ 1
17239
+ 1
17240
+ 1
17241
+ 1
17242
+ 1
17243
+ 1
17244
+ 1
17245
+ 1
17246
+ 1
17247
+ 1
17248
+ 1
17249
+ 1
17250
+ 1
17251
+ 1
17252
+ 1
17253
+ 1
17254
+ 1
17255
+ 1
17256
+ 1
17257
+ 1
17258
+ 1
17259
+ 1
17260
+ 1
17261
+ 1
17262
+ 1
17263
+ 1
17264
+ 1
17265
+ 1
17266
+ 1
17267
+ 1
17268
+ 1
17269
+ 1
17270
+ 1
17271
+ 1
17272
+ 1
17273
+ 1
17274
+ 1
17275
+ 1
17276
+ 1
17277
+ 1
17278
+ 1
17279
+ 1
17280
+ 1
17281
+ 1
17282
+ 1
17283
+ 1
17284
+ 1
17285
+ 1
17286
+ 1
17287
+ 1
17288
+ 1
17289
+ 1
17290
+ 1
17291
+ 1
17292
+ 1
17293
+ 1
17294
+ 1
17295
+ 1
17296
+ 1
17297
+ 1
17298
+ 1
17299
+ 1
17300
+ 1
17301
+ 1
17302
+ 1
17303
+ 1
17304
+ 1
17305
+ 1
17306
+ 1
17307
+ 1
17308
+ 1
17309
+ 1
17310
+ 1
17311
+ 1
17312
+ 1
17313
+ 1
17314
+ 1
17315
+ 1
17316
+ 1
17317
+ 1
17318
+ 1
17319
+ 1
17320
+ 1
17321
+ 1
17322
+ 1
17323
+ 1
17324
+ 1
17325
+ 1
17326
+ 1
17327
+ 1
17328
+ 1
17329
+ 1
17330
+ 1
17331
+ 1
17332
+ 1
17333
+ 1
17334
+ 1
17335
+ 1
17336
+ 1
17337
+ 1
17338
+ 1
17339
+ 1
17340
+ 1
17341
+ 1
17342
+ 1
17343
+ 1
17344
+ 1
17345
+ 1
17346
+ 1
17347
+ 1
17348
+ 1
17349
+ 1
17350
+ 1
17351
+ 1
17352
+ 1
17353
+ 1
17354
+ 1
17355
+ 1
17356
+ 1
17357
+ 1
17358
+ 1
17359
+ 1
17360
+ 1
17361
+ 1
17362
+ 1
17363
+ 1
17364
+ 1
17365
+ 1
17366
+ 1
17367
+ 1
17368
+ 1
17369
+ 1
17370
+ 1
17371
+ 1
17372
+ 1
17373
+ 1
17374
+ 1
17375
+ 1
17376
+ 1
17377
+ 1
17378
+ 1
17379
+ 1
17380
+ 1
17381
+ 1
17382
+ 1
17383
+ 1
17384
+ 1
17385
+ 1
17386
+ 1
17387
+ 1
17388
+ 1
17389
+ 1
17390
+ 1
17391
+ 1
17392
+ 1
17393
+ 1
17394
+ 1
17395
+ 1
17396
+ 1
17397
+ 1
17398
+ 1
17399
+ 1
17400
+ 1
17401
+ 1
17402
+ 1
17403
+ 1
17404
+ 1
17405
+ 1
17406
+ 1
17407
+ 1
17408
+ 1
17409
+ 1
17410
+ 1
17411
+ 1
17412
+ 1
17413
+ 1
17414
+ 1
17415
+ 1
17416
+ 1
17417
+ 1
17418
+ 1
17419
+ 1
17420
+ 1
17421
+ 1
17422
+ 1
17423
+ 1
17424
+ 1
17425
+ 1
17426
+ 1
17427
+ 1
17428
+ 1
17429
+ 1
17430
+ 1
17431
+ 1
17432
+ 1
17433
+ 1
17434
+ 1
17435
+ 1
17436
+ 1
17437
+ 1
17438
+ 1
17439
+ 1
17440
+ 1
17441
+ 1
17442
+ 1
17443
+ 1
17444
+ 1
17445
+ 1
17446
+ 1
17447
+ 1
17448
+ 1
17449
+ 1
17450
+ 1
17451
+ 1
17452
+ 1
17453
+ 1
17454
+ 1
17455
+ 1
17456
+ 1
17457
+ 1
17458
+ 1
17459
+ 1
17460
+ 1
17461
+ 1
17462
+ 1
17463
+ 1
17464
+ 1
17465
+ 1
17466
+ 1
17467
+ 1
17468
+ 1
17469
+ 1
17470
+ 1
17471
+ 1
17472
+ 1
17473
+ 1
17474
+ 1
17475
+ 1
17476
+ 1
17477
+ 1
17478
+ 1
17479
+ 1
17480
+ 1
17481
+ 1
17482
+ 1
17483
+ 1
17484
+ 1
17485
+ 1
17486
+ 1
17487
+ 1
17488
+ 1
17489
+ 1
17490
+ 1
17491
+ 1
17492
+ 1
17493
+ 1
17494
+ 1
17495
+ 1
17496
+ 1
17497
+ 1
17498
+ 1
17499
+ 1
17500
+ 1
17501
+ 1
17502
+ 1
17503
+ 1
17504
+ 1
17505
+ 1
17506
+ 1
17507
+ 1
17508
+ 1
17509
+ 1
17510
+ 1
17511
+ 1
17512
+ 1
17513
+ 1
17514
+ 1
17515
+ 1
17516
+ 1
17517
+ 1
17518
+ 1
17519
+ 1
17520
+ 1
17521
+ 1
17522
+ 1
17523
+ 1
17524
+ 1
17525
+ 1
17526
+ 1
17527
+ 1
17528
+ 1
17529
+ 1
17530
+ 1
17531
+ 1
17532
+ 1
17533
+ 1
17534
+ 1
17535
+ 1
17536
+ 1
17537
+ 1
17538
+ 1
17539
+ 1
17540
+ 1
17541
+ 1
17542
+ 1
17543
+ 1
17544
+ 1
17545
+ 1
17546
+ 1
17547
+ 1
17548
+ 1
17549
+ 1
17550
+ 1
17551
+ 1
17552
+ 1
17553
+ 1
17554
+ 1
17555
+ 1
17556
+ 1
17557
+ 1
17558
+ 1
17559
+ 1
17560
+ 1
17561
+ 1
17562
+ 1
17563
+ 1
17564
+ 1
17565
+ 1
17566
+ 1
17567
+ 1
17568
+ 1
17569
+ 1
17570
+ 1
17571
+ 1
17572
+ 1
17573
+ 1
17574
+ 1
17575
+ 1
17576
+ 1
17577
+ 1
17578
+ 1
17579
+ 1
17580
+ 1
17581
+ 1
17582
+ 1
17583
+ 1
17584
+ 1
17585
+ 1
17586
+ 1
17587
+ 1
17588
+ 1
17589
+ 1
17590
+ 1
17591
+ 1
17592
+ 1
17593
+ 1
17594
+ 1
17595
+ 1
17596
+ 1
17597
+ 1
17598
+ 1
17599
+ 1
17600
+ 1
17601
+ 1
17602
+ 1
17603
+ 1
17604
+ 1
17605
+ 1
17606
+ 1
17607
+ 1
17608
+ 1
17609
+ 1
17610
+ 1
17611
+ 1
17612
+ 1
17613
+ 1
17614
+ 1
17615
+ 1
17616
+ 1
17617
+ 1
17618
+ 1
17619
+ 1
17620
+ 1
17621
+ 1
17622
+ 1
17623
+ 1
17624
+ 1
17625
+ 1
17626
+ 1
17627
+ 1
17628
+ 1
17629
+ 1
17630
+ 1
17631
+ 1
17632
+ 1
17633
+ 1
17634
+ 1
17635
+ 1
17636
+ 1
17637
+ 1
17638
+ 1
17639
+ 1
17640
+ 1
17641
+ 1
17642
+ 1
17643
+ 1
17644
+ 1
17645
+ 1
17646
+ 1
17647
+ 1
17648
+ 1
17649
+ 1
17650
+ 1
17651
+ 1
17652
+ 1
17653
+ 1
17654
+ 1
17655
+ 1
17656
+ 1
17657
+ 1
17658
+ 1
17659
+ 1
17660
+ 1
17661
+ 1
17662
+ 1
17663
+ 1
17664
+ 1
17665
+ 1
17666
+ 1
17667
+ 1
17668
+ 1
17669
+ 1
17670
+ 1
17671
+ 1
17672
+ 1
17673
+ 1
17674
+ 1
17675
+ 1
17676
+ 1
17677
+ 1
17678
+ 1
17679
+ 1
17680
+ 1
17681
+ 1
17682
+ 1
17683
+ 1
17684
+ 1
17685
+ 1
17686
+ 1
17687
+ 1
17688
+ 1
17689
+ 1
17690
+ 1
17691
+ 1
17692
+ 1
17693
+ 1
17694
+ 1
17695
+ 1
17696
+ 1
17697
+ 1
17698
+ 1
17699
+ 1
17700
+ 1
17701
+ 1
17702
+ 1
17703
+ 1
17704
+ 1
17705
+ 1
17706
+ 1
17707
+ 1
17708
+ 1
17709
+ 1
17710
+ 1
17711
+ 1
17712
+ 1
17713
+ 1
17714
+ 1
17715
+ 1
17716
+ 1
17717
+ 1
17718
+ 1
17719
+ 1
17720
+ 1
17721
+ 1
17722
+ 1
17723
+ 1
17724
+ 1
17725
+ 1
17726
+ 1
17727
+ 1
17728
+ 1
17729
+ 1
17730
+ 1
17731
+ 1
17732
+ 1
17733
+ 1
17734
+ 1
17735
+ 1
17736
+ 1
17737
+ 1
17738
+ 1
17739
+ 1
17740
+ 1
17741
+ 1
17742
+ 1
17743
+ 1
17744
+ 1
17745
+ 1
17746
+ 1
17747
+ 1
17748
+ 1
17749
+ 1
17750
+ 1
17751
+ 1
17752
+ 1
17753
+ 1
17754
+ 1
17755
+ 1
17756
+ 1
17757
+ 1
17758
+ 1
17759
+ 1
17760
+ 1
17761
+ 1
17762
+ 1
17763
+ 1
17764
+ 1
17765
+ 1
17766
+ 1
17767
+ 1
17768
+ 1
17769
+ 1
17770
+ 1
17771
+ 1
17772
+ 1
17773
+ 1
17774
+ 1
17775
+ 1
17776
+ 1
17777
+ 1
17778
+ 1
17779
+ 1
17780
+ 1
17781
+ 1
17782
+ 1
17783
+ 1
17784
+ 1
17785
+ 1
17786
+ 1
17787
+ 1
17788
+ 1
17789
+ 1
17790
+ 1
17791
+ 1
17792
+ 1
17793
+ 1
17794
+ 1
17795
+ 1
17796
+ 1
17797
+ 1
17798
+ 1
17799
+ 1
17800
+ 1
17801
+ 1
17802
+ 1
17803
+ 1
17804
+ 1
17805
+ 1
17806
+ 1
17807
+ 1
17808
+ 1
17809
+ 1
17810
+ 1
17811
+ 1
17812
+ 1
17813
+ 1
17814
+ 1
17815
+ 1
17816
+ 1
17817
+ 1
17818
+ 1
17819
+ 1
17820
+ 1
17821
+ 1
17822
+ 1
17823
+ 1
17824
+ 1
17825
+ 1
17826
+ 1
17827
+ 1
17828
+ 1
17829
+ 1
17830
+ 1
17831
+ 1
17832
+ 1
17833
+ 1
17834
+ 1
17835
+ 1
17836
+ 1
17837
+ 1
17838
+ 1
17839
+ 1
17840
+ 1
17841
+ 1
17842
+ 1
17843
+ 1
17844
+ 1
17845
+ 1
17846
+ 1
17847
+ 1
17848
+ 1
17849
+ 1
17850
+ 1
17851
+ 1
17852
+ 1
17853
+ 1
17854
+ 1
17855
+ 1
17856
+ 1
17857
+ 1
17858
+ 1
17859
+ 1
17860
+ 1
17861
+ 1
17862
+ 1
17863
+ 1
17864
+ 1
17865
+ 1
17866
+ 1
17867
+ 1
17868
+ 1
17869
+ 1
17870
+ 1
17871
+ 1
17872
+ 1
17873
+ 1
17874
+ 1
17875
+ 1
17876
+ 1
17877
+ 1
17878
+ 1
17879
+ 1
17880
+ 1
17881
+ 1
17882
+ 1
17883
+ 1
17884
+ 1
17885
+ 1
17886
+ 1
17887
+ 1
17888
+ 1
17889
+ 1
17890
+ 1
17891
+ 1
17892
+ 1
17893
+ 1
17894
+ 1
17895
+ 1
17896
+ 1
17897
+ 1
17898
+ 1
17899
+ 1
17900
+ 1
17901
+ 1
17902
+ 1
17903
+ 1
17904
+ 1
17905
+ 1
17906
+ 1
17907
+ 1
17908
+ 1
17909
+ 1
17910
+ 1
17911
+ 1
17912
+ 1
17913
+ 1
17914
+ 1
17915
+ 1
17916
+ 1
17917
+ 1
17918
+ 1
17919
+ 1
17920
+ 1
17921
+ 1
17922
+ 1
17923
+ 1
17924
+ 1
17925
+ 1
17926
+ 1
17927
+ 1
17928
+ 1
17929
+ 1
17930
+ 1
17931
+ 1
17932
+ 1
17933
+ 1
17934
+ 1
17935
+ 1
17936
+ 1
17937
+ 1
17938
+ 1
17939
+ 1
17940
+ 1
17941
+ 1
17942
+ 1
17943
+ 1
17944
+ 1
17945
+ 1
17946
+ 1
17947
+ 1
17948
+ 1
17949
+ 1
17950
+ 1
17951
+ 1
17952
+ 1
17953
+ 1
17954
+ 1
17955
+ 1
17956
+ 1
17957
+ 1
17958
+ 1
17959
+ 2
17960
+ 2
17961
+ 1
17962
+ 1
17963
+ 2
17964
+ 1
17965
+ 1
17966
+ 1
17967
+ 1
17968
+ 1
17969
+ 1
17970
+ 1
17971
+ 1
17972
+ 1
17973
+ 1
17974
+ 1
17975
+ 1
17976
+ 1
17977
+ 1
17978
+ 1
17979
+ 1
17980
+ 1
17981
+ 1
17982
+ 1
17983
+ 1
17984
+ 1
17985
+ 1
17986
+ 1
17987
+ 1
17988
+ 1
17989
+ 1
17990
+ 1
17991
+ 1
17992
+ 1
17993
+ 1
17994
+ 1
17995
+ 1
17996
+ 1
17997
+ 1
17998
+ 1
17999
+ 1
18000
+ 1
18001
+ 1
18002
+ 1
18003
+ 1
18004
+ 1
18005
+ 1
18006
+ 1
18007
+ 1
18008
+ 1
18009
+ 1
18010
+ 1
18011
+ 1
18012
+ 1
18013
+ 1
18014
+ 1
18015
+ 1
18016
+ 1
18017
+ 1
18018
+ 1
18019
+ 1
18020
+ 1
18021
+ 1
18022
+ 1
18023
+ 1
18024
+ 1
18025
+ 1
18026
+ 1
18027
+ 1
18028
+ 1
18029
+ 1
18030
+ 1
18031
+ 1
18032
+ 1
18033
+ 1
18034
+ 1
18035
+ 1
18036
+ 1
18037
+ 1
18038
+ 1
18039
+ 1
18040
+ 1
18041
+ 1
18042
+ 1
18043
+ 1
18044
+ 1
18045
+ 1
18046
+ 1
18047
+ 1
18048
+ 1
18049
+ 1
18050
+ 1
18051
+ 1
18052
+ 1
18053
+ 1
18054
+ 1
18055
+ 1
18056
+ 1
18057
+ 1
18058
+ 1
18059
+ 1
18060
+ 1
18061
+ 1
18062
+ 1
18063
+ 1
18064
+ 1
18065
+ 1
18066
+ 1
18067
+ 1
18068
+ 1
18069
+ 1
18070
+ 1
18071
+ 1
18072
+ 1
18073
+ 1
18074
+ 1
18075
+ 1
18076
+ 1
18077
+ 1
18078
+ 1
18079
+ 1
18080
+ 1
18081
+ 1
18082
+ 1
18083
+ 1
18084
+ 1
18085
+ 1
18086
+ 1
18087
+ 1
18088
+ 1
18089
+ 1
18090
+ 1
18091
+ 1
18092
+ 1
18093
+ 1
18094
+ 1
18095
+ 1
18096
+ 1
18097
+ 1
18098
+ 1
18099
+ 1
18100
+ 1
18101
+ 1
18102
+ 1
18103
+ 1
18104
+ 1
18105
+ 1
18106
+ 1
18107
+ 1
18108
+ 1
18109
+ 1
18110
+ 1
18111
+ 1
18112
+ 1
18113
+ 1
18114
+ 1
18115
+ 1
18116
+ 1
18117
+ 1
18118
+ 1
18119
+ 1
18120
+ 1
18121
+ 1
18122
+ 1
18123
+ 1
18124
+ 1
18125
+ 1
18126
+ 1
18127
+ 1
18128
+ 1
18129
+ 1
18130
+ 1
18131
+ 1
18132
+ 1
18133
+ 1
18134
+ 1
18135
+ 1
18136
+ 1
18137
+ 1
18138
+ 1
18139
+ 1
18140
+ 1
18141
+ 1
18142
+ 1
18143
+ 1
18144
+ 1
18145
+ 1
18146
+ 1
18147
+ 1
18148
+ 1
18149
+ 1
18150
+ 1
18151
+ 1
18152
+ 1
18153
+ 1
18154
+ 1
18155
+ 1
18156
+ 1
18157
+ 1
18158
+ 1
18159
+ 1
18160
+ 1
18161
+ 1
18162
+ 1
18163
+ 1
18164
+ 1
18165
+ 1
18166
+ 1
18167
+ 1
18168
+ 1
18169
+ 1
18170
+ 1
18171
+ 1
18172
+ 1
18173
+ 1
18174
+ 1
18175
+ 1
18176
+ 1
18177
+ 1
18178
+ 1
18179
+ 1
18180
+ 1
18181
+ 1
18182
+ 1
18183
+ 1
18184
+ 1
18185
+ 1
18186
+ 1
18187
+ 1
18188
+ 1
18189
+ 1
18190
+ 1
18191
+ 1
18192
+ 1
18193
+ 1
18194
+ 1
18195
+ 1
18196
+ 1
18197
+ 1
18198
+ 1
18199
+ 1
18200
+ 1
18201
+ 1
18202
+ 1
18203
+ 1
18204
+ 1
18205
+ 1
18206
+ 1
18207
+ 1
18208
+ 1
18209
+ 1
18210
+ 1
18211
+ 1
18212
+ 1
18213
+ 1
18214
+ 1
18215
+ 1
18216
+ 1
18217
+ 1
18218
+ 1
18219
+ 1
18220
+ 1
18221
+ 1
18222
+ 1
18223
+ 1
18224
+ 1
18225
+ 2
18226
+ 1
18227
+ 1
18228
+ 1
18229
+ 1
18230
+ 1
18231
+ 1
18232
+ 1
18233
+ 1
18234
+ 1
18235
+ 1
18236
+ 1
18237
+ 1
18238
+ 1
18239
+ 1
18240
+ 1
18241
+ 1
18242
+ 1
18243
+ 1
18244
+ 1
18245
+ 1
18246
+ 1
18247
+ 1
18248
+ 1
18249
+ 1
18250
+ 1
18251
+ 1
18252
+ 1
18253
+ 1
18254
+ 1
18255
+ 1
18256
+ 1
18257
+ 1
18258
+ 1
18259
+ 1
18260
+ 1
18261
+ 1
18262
+ 1
18263
+ 1
18264
+ 1
18265
+ 1
18266
+ 1
18267
+ 1
18268
+ 1
18269
+ 1
18270
+ 1
18271
+ 1
18272
+ 1
18273
+ 1
18274
+ 1
18275
+ 1
18276
+ 1
18277
+ 1
18278
+ 1
18279
+ 1
18280
+ 1
18281
+ 1
18282
+ 1
18283
+ 1
18284
+ 1
18285
+ 1
18286
+ 1
18287
+ 1
18288
+ 1
18289
+ 1
18290
+ 1
18291
+ 1
18292
+ 1
18293
+ 1
18294
+ 1
18295
+ 1
18296
+ 1
18297
+ 1
18298
+ 1
18299
+ 1
18300
+ 1
18301
+ 1
18302
+ 1
18303
+ 1
18304
+ 1
18305
+ 1
18306
+ 1
18307
+ 1
18308
+ 1
18309
+ 1
18310
+ 1
18311
+ 1
18312
+ 1
18313
+ 1
18314
+ 1
18315
+ 1
18316
+ 1
18317
+ 1
18318
+ 1
18319
+ 1
18320
+ 1
18321
+ 1
18322
+ 1
18323
+ 1
18324
+ 1
18325
+ 1
18326
+ 1
18327
+ 1
18328
+ 1
18329
+ 1
18330
+ 1
18331
+ 1
18332
+ 1
18333
+ 1
18334
+ 1
18335
+ 1
18336
+ 1
18337
+ 1
18338
+ 1
18339
+ 1
18340
+ 1
18341
+ 1
18342
+ 1
18343
+ 1
18344
+ 1
18345
+ 1
18346
+ 1
18347
+ 1
18348
+ 1
18349
+ 1
18350
+ 1
18351
+ 1
18352
+ 1
18353
+ 1
18354
+ 1
18355
+ 1
18356
+ 1
18357
+ 1
18358
+ 1
18359
+ 1
18360
+ 1
18361
+ 1
18362
+ 1
18363
+ 1
18364
+ 1
18365
+ 1
18366
+ 1
18367
+ 1
18368
+ 1
18369
+ 1
18370
+ 1
18371
+ 1
18372
+ 1
18373
+ 1
18374
+ 1
18375
+ 1
18376
+ 1
18377
+ 1
18378
+ 1
18379
+ 1
18380
+ 1
18381
+ 1
18382
+ 1
18383
+ 1
18384
+ 1
18385
+ 1
18386
+ 1
18387
+ 1
18388
+ 1
18389
+ 1
18390
+ 1
18391
+ 1
18392
+ 1
18393
+ 1
18394
+ 1
18395
+ 1
18396
+ 1
18397
+ 1
18398
+ 1
18399
+ 1
18400
+ 1
18401
+ 1
18402
+ 1
18403
+ 1
18404
+ 1
18405
+ 1
18406
+ 1
18407
+ 1
18408
+ 1
18409
+ 1
18410
+ 1
18411
+ 1
18412
+ 1
18413
+ 1
18414
+ 1
18415
+ 1
18416
+ 1
18417
+ 1
18418
+ 1
18419
+ 1
18420
+ 1
18421
+ 1
18422
+ 1
18423
+ 1
18424
+ 1
18425
+ 1
18426
+ 1
18427
+ 1
18428
+ 1
18429
+ 1
18430
+ 1
18431
+ 1
18432
+ 1
18433
+ 1
18434
+ 1
18435
+ 1
18436
+ 1
18437
+ 1
18438
+ 1
18439
+ 1
18440
+ 1
18441
+ 1
18442
+ 1
18443
+ 1
18444
+ 1
18445
+ 1
18446
+ 1
18447
+ 1
18448
+ 1
18449
+ 1
18450
+ 1
18451
+ 1
18452
+ 1
18453
+ 1
18454
+ 1
18455
+ 1
18456
+ 1
18457
+ 1
18458
+ 1
18459
+ 1
18460
+ 1
18461
+ 1
18462
+ 1
18463
+ 1
18464
+ 1
18465
+ 1
18466
+ 1
18467
+ 1
18468
+ 1
18469
+ 1
18470
+ 1
18471
+ 1
18472
+ 1
18473
+ 1
18474
+ 1
18475
+ 1
18476
+ 1
18477
+ 1
18478
+ 1
18479
+ 1
18480
+ 1
18481
+ 1
18482
+ 1
18483
+ 1
18484
+ 1
18485
+ 1
18486
+ 1
18487
+ 1
18488
+ 1
18489
+ 1
18490
+ 1
18491
+ 1
18492
+ 1
18493
+ 1
18494
+ 1
18495
+ 1
18496
+ 1
18497
+ 1
18498
+ 1
18499
+ 1
18500
+ 1
18501
+ 1
18502
+ 1
18503
+ 1
18504
+ 1
18505
+ 1
18506
+ 1
18507
+ 1
18508
+ 1
18509
+ 1
18510
+ 1
18511
+ 1
18512
+ 1
18513
+ 1
18514
+ 1
18515
+ 1
18516
+ 1
18517
+ 1
18518
+ 1
18519
+ 1
18520
+ 1
18521
+ 1
18522
+ 1
18523
+ 1
18524
+ 1
18525
+ 1
18526
+ 1
18527
+ 1
18528
+ 1
18529
+ 1
18530
+ 1
18531
+ 1
18532
+ 1
18533
+ 1
18534
+ 1
18535
+ 1
18536
+ 1
18537
+ 1
18538
+ 1
18539
+ 1
18540
+ 1
18541
+ 1
18542
+ 1
18543
+ 1
18544
+ 1
18545
+ 1
18546
+ 1
18547
+ 1
18548
+ 1
18549
+ 1
18550
+ 1
18551
+ 1
18552
+ 1
18553
+ 1
18554
+ 1
18555
+ 1
18556
+ 1
18557
+ 1
18558
+ 1
18559
+ 1
18560
+ 1
18561
+ 1
18562
+ 1
18563
+ 1
18564
+ 1
18565
+ 1
18566
+ 1
18567
+ 1
18568
+ 1
18569
+ 1
18570
+ 1
18571
+ 1
18572
+ 1
18573
+ 1
18574
+ 1
18575
+ 1
18576
+ 1
18577
+ 1
18578
+ 1
18579
+ 1
18580
+ 1
18581
+ 1
18582
+ 1
18583
+ 1
18584
+ 1
18585
+ 1
18586
+ 1
18587
+ 1
18588
+ 1
18589
+ 1
18590
+ 1
18591
+ 1
18592
+ 1
18593
+ 1
18594
+ 1
18595
+ 1
18596
+ 1
18597
+ 1
18598
+ 1
18599
+ 1
18600
+ 1
18601
+ 1
18602
+ 1
18603
+ 1
18604
+ 1
18605
+ 1
18606
+ 1
18607
+ 1
18608
+ 1
18609
+ 1
18610
+ 1
18611
+ 1
18612
+ 1
18613
+ 1
18614
+ 1
18615
+ 1
18616
+ 1
18617
+ 1
18618
+ 1
18619
+ 1
18620
+ 1
18621
+ 1
18622
+ 1
18623
+ 1
18624
+ 1
18625
+ 1
18626
+ 1
18627
+ 1
18628
+ 1
18629
+ 1
18630
+ 1
18631
+ 1
18632
+ 1
18633
+ 1
18634
+ 1
18635
+ 1
18636
+ 1
18637
+ 1
18638
+ 1
18639
+ 1
18640
+ 1
18641
+ 1
18642
+ 1
18643
+ 1
18644
+ 1
18645
+ 1
18646
+ 1
18647
+ 1
18648
+ 1
18649
+ 1
18650
+ 1
18651
+ 1
18652
+ 1
18653
+ 1
18654
+ 1
18655
+ 1
18656
+ 1
18657
+ 1
18658
+ 1
18659
+ 1
18660
+ 1
18661
+ 1
18662
+ 1
18663
+ 1
18664
+ 1
18665
+ 1
18666
+ 1
18667
+ 1
18668
+ 1
18669
+ 1
18670
+ 1
18671
+ 1
18672
+ 1
18673
+ 1
18674
+ 1
18675
+ 1
18676
+ 1
18677
+ 1
18678
+ 1
18679
+ 1
18680
+ 1
18681
+ 1
18682
+ 1
18683
+ 1
18684
+ 1
18685
+ 1
18686
+ 1
18687
+ 1
18688
+ 1
18689
+ 1
18690
+ 1
18691
+ 1
18692
+ 1
18693
+ 1
18694
+ 1
18695
+ 1
18696
+ 1
18697
+ 1
18698
+ 1
18699
+ 1
18700
+ 1
18701
+ 1
18702
+ 1
18703
+ 1
18704
+ 1
18705
+ 1
18706
+ 1
18707
+ 1
18708
+ 1
18709
+ 1
18710
+ 1
18711
+ 1
18712
+ 1
18713
+ 1
18714
+ 1
18715
+ 1
18716
+ 1
18717
+ 1
18718
+ 1
18719
+ 1
18720
+ 1
18721
+ 1
18722
+ 1
18723
+ 1
18724
+ 1
18725
+ 1
18726
+ 1
18727
+ 1
18728
+ 1
18729
+ 1
18730
+ 1
18731
+ 1
18732
+ 1
18733
+ 1
18734
+ 1
18735
+ 1
18736
+ 1
18737
+ 1
18738
+ 1
18739
+ 1
18740
+ 1
18741
+ 1
18742
+ 1
18743
+ 1
18744
+ 1
18745
+ 1
18746
+ 1
18747
+ 1
18748
+ 1
18749
+ 1
18750
+ 1
18751
+ 1
18752
+ 1
18753
+ 1
18754
+ 1
18755
+ 1
18756
+ 1
18757
+ 1
18758
+ 1
18759
+ 1
18760
+ 1
18761
+ 1
18762
+ 1
18763
+ 1
18764
+ 1
18765
+ 1
18766
+ 1
18767
+ 1
18768
+ 1
18769
+ 1
18770
+ 1
18771
+ 1
18772
+ 1
18773
+ 1
18774
+ 1
18775
+ 1
18776
+ 1
18777
+ 1
18778
+ 1
18779
+ 1
18780
+ 1
18781
+ 1
18782
+ 1
18783
+ 1
18784
+ 1
18785
+ 1
18786
+ 1
18787
+ 1
18788
+ 1
18789
+ 1
18790
+ 1
18791
+ 1
18792
+ 1
18793
+ 1
18794
+ 1
18795
+ 1
18796
+ 1
18797
+ 1
18798
+ 1
18799
+ 1
18800
+ 1
18801
+ 1
18802
+ 1
18803
+ 1
18804
+ 1
18805
+ 1
18806
+ 1
18807
+ 1
18808
+ 1
18809
+ 1
18810
+ 1
18811
+ 1
18812
+ 1
18813
+ 1
18814
+ 1
18815
+ 1
18816
+ 1
18817
+ 1
18818
+ 1
18819
+ 1
18820
+ 1
18821
+ 1
18822
+ 1
18823
+ 1
18824
+ 1
18825
+ 1
18826
+ 1
18827
+ 1
18828
+ 1
18829
+ 1
18830
+ 1
18831
+ 1
18832
+ 1
18833
+ 1
18834
+ 1
18835
+ 1
18836
+ 1
18837
+ 1
18838
+ 1
18839
+ 1
18840
+ 1
18841
+ 1
18842
+ 1
18843
+ 1
18844
+ 1
18845
+ 1
18846
+ 1
18847
+ 1
18848
+ 1
18849
+ 1
18850
+ 1
18851
+ 1
18852
+ 1
18853
+ 1
18854
+ 1
18855
+ 1
18856
+ 1
18857
+ 1
18858
+ 1
18859
+ 1
18860
+ 1
18861
+ 1
18862
+ 1
18863
+ 1
18864
+ 1
18865
+ 1
18866
+ 1
18867
+ 1
18868
+ 1
18869
+ 1
18870
+ 1
18871
+ 1
18872
+ 1
18873
+ 1
18874
+ 1
18875
+ 1
18876
+ 1
18877
+ 1
18878
+ 1
18879
+ 1
18880
+ 1
18881
+ 1
18882
+ 1
18883
+ 1
18884
+ 1
18885
+ 1
18886
+ 1
18887
+ 1
18888
+ 1
18889
+ 1
18890
+ 1
18891
+ 1
18892
+ 1
18893
+ 1
18894
+ 1
18895
+ 1
18896
+ 1
18897
+ 1
18898
+ 1
18899
+ 1
18900
+ 1
18901
+ 1
18902
+ 1
18903
+ 1
18904
+ 1
18905
+ 1
18906
+ 1
18907
+ 1
18908
+ 1
18909
+ 1
18910
+ 1
18911
+ 1
18912
+ 1
18913
+ 1
18914
+ 1
18915
+ 1
18916
+ 1
18917
+ 1
18918
+ 1
18919
+ 1
18920
+ 1
18921
+ 1
18922
+ 1
18923
+ 1
18924
+ 1
18925
+ 1
18926
+ 1
18927
+ 1
18928
+ 1
18929
+ 1
18930
+ 1
18931
+ 1
18932
+ 1
18933
+ 1
18934
+ 1
18935
+ 1
18936
+ 1
18937
+ 1
18938
+ 1
18939
+ 1
18940
+ 1
18941
+ 1
18942
+ 1
18943
+ 1
18944
+ 1
18945
+ 1
18946
+ 1
18947
+ 1
18948
+ 1
18949
+ 1
18950
+ 1
18951
+ 1
18952
+ 1
18953
+ 1
18954
+ 1
18955
+ 1
18956
+ 1
18957
+ 1
18958
+ 1
18959
+ 1
18960
+ 1
18961
+ 1
18962
+ 1
18963
+ 1
18964
+ 1
18965
+ 1
18966
+ 1
18967
+ 1
18968
+ 1
18969
+ 1
18970
+ 1
18971
+ 1
18972
+ 1
18973
+ 1
18974
+ 1
18975
+ 1
18976
+ 1
18977
+ 1
18978
+ 1
18979
+ 1
18980
+ 1
18981
+ 1
18982
+ 1
18983
+ 1
18984
+ 1
18985
+ 1
18986
+ 1
18987
+ 1
18988
+ 1
18989
+ 1
18990
+ 1
18991
+ 1
18992
+ 1
18993
+ 1
18994
+ 1
18995
+ 1
18996
+ 1
18997
+ 1
18998
+ 1
18999
+ 1
19000
+ 1
19001
+ 1
19002
+ 1
19003
+ 1
19004
+ 1
19005
+ 1
19006
+ 1
19007
+ 1
19008
+ 1
19009
+ 1
19010
+ 1
19011
+ 1
19012
+ 1
19013
+ 1
19014
+ 1
19015
+ 1
19016
+ 1
19017
+ 1
19018
+ 1
19019
+ 1
19020
+ 1
19021
+ 1
19022
+ 1
19023
+ 1
19024
+ 1
19025
+ 1
19026
+ 1
19027
+ 1
19028
+ 1
19029
+ 1
19030
+ 1
19031
+ 1
19032
+ 1
19033
+ 1
19034
+ 1
19035
+ 1
19036
+ 1
19037
+ 1
19038
+ 1
19039
+ 1
19040
+ 1
19041
+ 1
19042
+ 1
19043
+ 1
19044
+ 1
19045
+ 1
19046
+ 1
19047
+ 1
19048
+ 1
19049
+ 1
19050
+ 1
19051
+ 1
19052
+ 1
19053
+ 1
19054
+ 1
19055
+ 1
19056
+ 1
19057
+ 1
19058
+ 1
19059
+ 1
19060
+ 1
19061
+ 1
19062
+ 1
19063
+ 1
19064
+ 1
19065
+ 1
19066
+ 1
19067
+ 1
19068
+ 1
19069
+ 1
19070
+ 1
19071
+ 1
19072
+ 1
19073
+ 1
19074
+ 1
19075
+ 1
19076
+ 1
19077
+ 1
19078
+ 1
19079
+ 1
19080
+ 1
19081
+ 1
19082
+ 1
19083
+ 1
19084
+ 1
19085
+ 1
19086
+ 1
19087
+ 1
19088
+ 1
19089
+ 1
19090
+ 1
19091
+ 1
19092
+ 1
19093
+ 1
19094
+ 1
19095
+ 1
19096
+ 1
19097
+ 1
19098
+ 1
19099
+ 1
19100
+ 1
19101
+ 1
19102
+ 1
19103
+ 1
19104
+ 1
19105
+ 1
19106
+ 1
19107
+ 1
19108
+ 1
19109
+ 1
19110
+ 1
19111
+ 1
19112
+ 1
19113
+ 1
19114
+ 1
19115
+ 1
19116
+ 1
19117
+ 1
19118
+ 1
19119
+ 1
19120
+ 1
19121
+ 1
19122
+ 1
19123
+ 1
19124
+ 1
19125
+ 1
19126
+ 1
19127
+ 1
19128
+ 1
19129
+ 1
19130
+ 1
19131
+ 1
19132
+ 1
19133
+ 1
19134
+ 1
19135
+ 1
19136
+ 1
19137
+ 1
19138
+ 1
19139
+ 1
19140
+ 1
19141
+ 1
19142
+ 1
19143
+ 1
19144
+ 1
19145
+ 1
19146
+ 1
19147
+ 1
19148
+ 1
19149
+ 1
19150
+ 1
19151
+ 1
19152
+ 1
19153
+ 1
19154
+ 1
19155
+ 1
19156
+ 1
19157
+ 1
19158
+ 1
19159
+ 1
19160
+ 1
19161
+ 1
19162
+ 1
19163
+ 1
19164
+ 1
19165
+ 1
19166
+ 1
19167
+ 1
19168
+ 1
19169
+ 1
19170
+ 1
19171
+ 1
19172
+ 1
19173
+ 1
19174
+ 1
19175
+ 1
19176
+ 1
19177
+ 1
19178
+ 1
19179
+ 1
19180
+ 1
19181
+ 1
19182
+ 1
19183
+ 1
19184
+ 1
19185
+ 1
19186
+ 1
19187
+ 1
19188
+ 1
19189
+ 1
19190
+ 1
19191
+ 1
19192
+ 1
19193
+ 1
19194
+ 1
19195
+ 1
19196
+ 1
19197
+ 1
19198
+ 1
19199
+ 1
19200
+ 1
19201
+ 1
19202
+ 1
19203
+ 1
19204
+ 1
19205
+ 1
19206
+ 1
19207
+ 1
19208
+ 1
19209
+ 1
19210
+ 1
19211
+ 1
19212
+ 1
19213
+ 1
19214
+ 1
19215
+ 1
19216
+ 1
19217
+ 1
19218
+ 1
19219
+ 1
19220
+ 1
19221
+ 1
19222
+ 1
19223
+ 1
19224
+ 1
19225
+ 1
19226
+ 1
19227
+ 1
19228
+ 1
19229
+ 1
19230
+ 1
19231
+ 1
19232
+ 1
19233
+ 1
19234
+ 1
19235
+ 1
19236
+ 1
19237
+ 1
19238
+ 1
19239
+ 1
19240
+ 1
19241
+ 1
19242
+ 1
19243
+ 1
19244
+ 1
19245
+ 1
19246
+ 1
19247
+ 1
19248
+ 1
19249
+ 1
19250
+ 1
19251
+ 1
19252
+ 1
19253
+ 1
19254
+ 1
19255
+ 1
19256
+ 1
19257
+ 1
19258
+ 1
19259
+ 1
19260
+ 1
19261
+ 1
19262
+ 1
19263
+ 1
19264
+ 1
19265
+ 1
19266
+ 1
19267
+ 1
19268
+ 1
19269
+ 1
19270
+ 1
19271
+ 1
19272
+ 1
19273
+ 1
19274
+ 1
19275
+ 1
19276
+ 1
19277
+ 1
19278
+ 1
19279
+ 1
19280
+ 1
19281
+ 1
19282
+ 1
19283
+ 1
19284
+ 1
19285
+ 1
19286
+ 1
19287
+ 1
19288
+ 1
19289
+ 1
19290
+ 1
19291
+ 1
19292
+ 1
19293
+ 1
19294
+ 1
19295
+ 1
19296
+ 1
19297
+ 1
19298
+ 1
19299
+ 1
19300
+ 1
19301
+ 1
19302
+ 1
19303
+ 1
19304
+ 1
19305
+ 1
19306
+ 1
19307
+ 1
19308
+ 1
19309
+ 1
19310
+ 1
19311
+ 1
19312
+ 1
19313
+ 1
19314
+ 1
19315
+ 1
19316
+ 1
19317
+ 1
19318
+ 1
19319
+ 1
19320
+ 1
19321
+ 1
19322
+ 1
19323
+ 1
19324
+ 1
19325
+ 1
19326
+ 1
19327
+ 1
19328
+ 1
19329
+ 1
19330
+ 1
19331
+ 1
19332
+ 1
19333
+ 1
19334
+ 1
19335
+ 1
19336
+ 1
19337
+ 1
19338
+ 1
19339
+ 1
19340
+ 1
19341
+ 1
19342
+ 1
19343
+ 1
19344
+ 1
19345
+ 1
19346
+ 1
19347
+ 1
19348
+ 1
19349
+ 1
19350
+ 1
19351
+ 1
19352
+ 1
19353
+ 1
19354
+ 1
19355
+ 1
19356
+ 1
19357
+ 1
19358
+ 1
19359
+ 1
19360
+ 1
19361
+ 1
19362
+ 1
19363
+ 1
19364
+ 1
19365
+ 1
19366
+ 1
19367
+ 1
19368
+ 1
19369
+ 1
19370
+ 1
19371
+ 1
19372
+ 1
19373
+ 1
19374
+ 1
19375
+ 1
19376
+ 1
19377
+ 1
19378
+ 1
19379
+ 1
19380
+ 1
19381
+ 1
19382
+ 1
19383
+ 1
19384
+ 1
19385
+ 1
19386
+ 1
19387
+ 1
19388
+ 1
19389
+ 1
19390
+ 1
19391
+ 1
19392
+ 1
19393
+ 1
19394
+ 1
19395
+ 1
19396
+ 1
19397
+ 1
19398
+ 1
19399
+ 1
19400
+ 1
19401
+ 1
19402
+ 1
19403
+ 1
19404
+ 1
19405
+ 1
19406
+ 1
19407
+ 1
19408
+ 1
19409
+ 1
19410
+ 1
19411
+ 1
19412
+ 1
19413
+ 1
19414
+ 1
19415
+ 1
19416
+ 1
19417
+ 1
19418
+ 1
19419
+ 1
19420
+ 1
19421
+ 1
19422
+ 1
19423
+ 1
19424
+ 1
19425
+ 1
19426
+ 1
19427
+ 1
19428
+ 1
19429
+ 1
19430
+ 1
19431
+ 1
19432
+ 1
19433
+ 1
19434
+ 1
19435
+ 1
19436
+ 1
19437
+ 1
19438
+ 1
19439
+ 1
19440
+ 1
19441
+ 1
19442
+ 1
19443
+ 1
19444
+ 1
19445
+ 1
19446
+ 1
19447
+ 1
19448
+ 1
19449
+ 1
19450
+ 1
19451
+ 1
19452
+ 1
19453
+ 1
19454
+ 1
19455
+ 1
19456
+ 1
19457
+ 1
19458
+ 1
19459
+ 1
19460
+ 1
19461
+ 1
19462
+ 1
19463
+ 1
19464
+ 1
19465
+ 1
19466
+ 1
19467
+ 1
19468
+ 1
19469
+ 1
19470
+ 1
19471
+ 1
19472
+ 1
19473
+ 1
19474
+ 1
19475
+ 1
19476
+ 1
19477
+ 1
19478
+ 1
19479
+ 1
19480
+ 1
19481
+ 1
19482
+ 1
19483
+ 1
19484
+ 1
19485
+ 1
19486
+ 1
19487
+ 1
19488
+ 1
19489
+ 1
19490
+ 1
19491
+ 1
19492
+ 1
19493
+ 1
19494
+ 1
19495
+ 1
19496
+ 1
19497
+ 1
19498
+ 1
19499
+ 1
19500
+ 1
19501
+ 1
19502
+ 1
19503
+ 1
19504
+ 1
19505
+ 1
19506
+ 1
19507
+ 1
19508
+ 1
19509
+ 1
19510
+ 1
19511
+ 1
19512
+ 1
19513
+ 1
19514
+ 1
19515
+ 1
19516
+ 1
19517
+ 1
19518
+ 1
19519
+ 1
19520
+ 1
19521
+ 1
19522
+ 1
19523
+ 1
19524
+ 1
19525
+ 1
19526
+ 1
19527
+ 1
19528
+ 1
19529
+ 1
19530
+ 1
19531
+ 1
19532
+ 1
19533
+ 1
19534
+ 1
19535
+ 1
19536
+ 1
19537
+ 1
19538
+ 1
19539
+ 1
19540
+ 1
19541
+ 1
19542
+ 1
19543
+ 1
19544
+ 1
19545
+ 1
19546
+ 1
19547
+ 1
19548
+ 1
19549
+ 1
19550
+ 1
19551
+ 1
19552
+ 1
19553
+ 1
19554
+ 1
19555
+ 1
19556
+ 1
19557
+ 1
19558
+ 1
19559
+ 1
19560
+ 1
19561
+ 1
19562
+ 1
19563
+ 1
19564
+ 1
19565
+ 1
19566
+ 1
19567
+ 1
19568
+ 1
19569
+ 1
19570
+ 1
19571
+ 1
19572
+ 1
19573
+ 1
19574
+ 1
19575
+ 1
19576
+ 1
19577
+ 1
19578
+ 1
19579
+ 1
19580
+ 1
19581
+ 1
19582
+ 1
19583
+ 1
19584
+ 1
19585
+ 1
19586
+ 1
19587
+ 1
19588
+ 1
19589
+ 1
19590
+ 1
19591
+ 1
19592
+ 1
19593
+ 1
19594
+ 1
19595
+ 1
19596
+ 1
19597
+ 1
19598
+ 1
19599
+ 1
19600
+ 1
19601
+ 1
19602
+ 1
19603
+ 1
19604
+ 1
19605
+ 1
19606
+ 1
19607
+ 1
19608
+ 1
19609
+ 1
19610
+ 1
19611
+ 1
19612
+ 1
19613
+ 1
19614
+ 1
19615
+ 1
19616
+ 1
19617
+ 1
19618
+ 1
19619
+ 1
19620
+ 1
19621
+ 1
19622
+ 1
19623
+ 1
19624
+ 1
19625
+ 1
19626
+ 1
19627
+ 1
19628
+ 1
19629
+ 1
19630
+ 1
19631
+ 1
19632
+ 1
19633
+ 1
19634
+ 1
19635
+ 1
19636
+ 1
19637
+ 1
19638
+ 1
19639
+ 1
19640
+ 1
19641
+ 1
19642
+ 1
19643
+ 1
19644
+ 1
19645
+ 1
19646
+ 1
19647
+ 1
19648
+ 1
19649
+ 1
19650
+ 1
19651
+ 1
19652
+ 1
19653
+ 1
19654
+ 1
19655
+ 1
19656
+ 1
19657
+ 1
19658
+ 1
19659
+ 1
19660
+ 1
19661
+ 1
19662
+ 1
19663
+ 1
19664
+ 1
19665
+ 1
19666
+ 1
19667
+ 1
19668
+ 1
19669
+ 1
19670
+ 1
19671
+ 1
19672
+ 1
19673
+ 1
19674
+ 1
19675
+ 1
19676
+ 1
19677
+ 1
19678
+ 1
19679
+ 1
19680
+ 1
19681
+ 1
19682
+ 1
19683
+ 1
19684
+ 1
19685
+ 1
19686
+ 1
19687
+ 1
19688
+ 1
19689
+ 1
19690
+ 1
19691
+ 1
19692
+ 1
19693
+ 1
19694
+ 1
19695
+ 1
19696
+ 1
19697
+ 1
19698
+ 1
19699
+ 1
19700
+ 1
19701
+ 1
19702
+ 1
19703
+ 1
19704
+ 1
19705
+ 1
19706
+ 1
19707
+ 1
19708
+ 1
19709
+ 1
19710
+ 1
19711
+ 1
19712
+ 1
19713
+ 1
19714
+ 1
19715
+ 1
19716
+ 1
19717
+ 1
19718
+ 1
19719
+ 1
19720
+ 1
19721
+ 1
19722
+ 1
19723
+ 1
19724
+ 1
19725
+ 1
19726
+ 1
19727
+ 1
19728
+ 1
19729
+ 1
19730
+ 1
19731
+ 1
19732
+ 1
19733
+ 1
19734
+ 1
19735
+ 1
19736
+ 1
19737
+ 1
19738
+ 1
19739
+ 1
19740
+ 1
19741
+ 1
19742
+ 1
19743
+ 1
19744
+ 1
19745
+ 1
19746
+ 1
19747
+ 1
19748
+ 1
19749
+ 1
19750
+ 1
19751
+ 1
19752
+ 1
19753
+ 1
19754
+ 1
19755
+ 1
19756
+ 1
19757
+ 1
19758
+ 1
19759
+ 1
19760
+ 1
19761
+ 1
19762
+ 1
19763
+ 1
19764
+ 1
19765
+ 1
19766
+ 1
19767
+ 1
19768
+ 1
19769
+ 1
19770
+ 1
19771
+ 1
19772
+ 1
19773
+ 1
19774
+ 1
19775
+ 1
19776
+ 1
19777
+ 1
19778
+ 1
19779
+ 1
19780
+ 1
19781
+ 1
19782
+ 1
19783
+ 1
19784
+ 1
19785
+ 1
19786
+ 1
19787
+ 1
19788
+ 1
19789
+ 1
19790
+ 1
19791
+ 1
19792
+ 1
19793
+ 1
19794
+ 1
19795
+ 1
19796
+ 1
19797
+ 1
19798
+ 1
19799
+ 1
19800
+ 1
19801
+ 1
19802
+ 1
19803
+ 1
19804
+ 1
19805
+ 1
19806
+ 1
19807
+ 1
19808
+ 1
19809
+ 1
19810
+ 1
19811
+ 1
19812
+ 1
19813
+ 1
19814
+ 1
19815
+ 1
19816
+ 1
19817
+ 1
19818
+ 1
19819
+ 1
19820
+ 1
19821
+ 1
19822
+ 1
19823
+ 1
19824
+ 1
19825
+ 1
19826
+ 1
19827
+ 1
19828
+ 1
19829
+ 1
19830
+ 1
19831
+ 1
19832
+ 1
19833
+ 1
19834
+ 1
19835
+ 1
19836
+ 1
19837
+ 1
19838
+ 1
19839
+ 1
19840
+ 1
19841
+ 1
19842
+ 1
19843
+ 1
19844
+ 1
19845
+ 1
19846
+ 1
19847
+ 1
19848
+ 1
19849
+ 1
19850
+ 1
19851
+ 1
19852
+ 1
19853
+ 1
19854
+ 1
19855
+ 1
19856
+ 1
19857
+ 1
19858
+ 1
19859
+ 1
19860
+ 1
19861
+ 1
19862
+ 1
19863
+ 1
19864
+ 1
19865
+ 1
19866
+ 1
19867
+ 1
19868
+ 1
19869
+ 1
19870
+ 1
19871
+ 1
19872
+ 1
19873
+ 1
19874
+ 1
19875
+ 1
19876
+ 1
19877
+ 1
19878
+ 1
19879
+ 1
19880
+ 1
19881
+ 1
19882
+ 1
19883
+ 1
19884
+ 1
19885
+ 1
19886
+ 1
19887
+ 1
19888
+ 1
19889
+ 1
19890
+ 1
19891
+ 1
19892
+ 1
19893
+ 1
19894
+ 1
19895
+ 1
19896
+ 1
19897
+ 1
19898
+ 1
19899
+ 1
19900
+ 1
19901
+ 1
19902
+ 1
19903
+ 1
19904
+ 1
19905
+ 1
19906
+ 1
19907
+ 1
19908
+ 1
19909
+ 1
19910
+ 1
19911
+ 1
19912
+ 1
19913
+ 1
19914
+ 1
19915
+ 1
19916
+ 1
19917
+ 1
19918
+ 1
19919
+ 1
19920
+ 1
19921
+ 1
19922
+ 1
19923
+ 1
19924
+ 1
19925
+ 1
19926
+ 1
19927
+ 1
19928
+ 1
19929
+ 1
19930
+ 1
19931
+ 1
19932
+ 1
19933
+ 1
19934
+ 1
19935
+ 1
19936
+ 1
19937
+ 1
19938
+ 1
19939
+ 1
19940
+ 1
19941
+ 1
19942
+ 1
19943
+ 1
19944
+ 1
19945
+ 1
19946
+ 1
19947
+ 1
19948
+ 1
19949
+ 1
19950
+ 1
19951
+ 1
19952
+ 1
19953
+ 1
19954
+ 1
19955
+ 1
19956
+ 1
19957
+ 1
19958
+ 1
19959
+ 1
19960
+ 1
19961
+ 1
19962
+ 1
19963
+ 1
19964
+ 1
19965
+ 1
19966
+ 1
19967
+ 1
19968
+ 1
19969
+ 1
19970
+ 1
19971
+ 1
19972
+ 1
19973
+ 1
19974
+ 1
19975
+ 1
19976
+ 1
19977
+ 1
19978
+ 1
19979
+ 1
19980
+ 1
19981
+ 1
19982
+ 1
19983
+ 1
19984
+ 1
19985
+ 1
19986
+ 1
19987
+ 1
19988
+ 1
19989
+ 1
19990
+ 1
19991
+ 1
19992
+ 1
19993
+ 1
19994
+ 1
19995
+ 1
19996
+ 1
19997
+ 1
19998
+ 1
19999
+ 1
20000
+ 1
20001
+ 1
20002
+ 1
20003
+ 1
20004
+ 1
20005
+ 1
20006
+ 1
20007
+ 1
20008
+ 1
20009
+ 1
20010
+ 1
20011
+ 1
20012
+ 1
20013
+ 1
20014
+ 1
20015
+ 1
20016
+ 1
20017
+ 1
20018
+ 1
20019
+ 1
20020
+ 1
20021
+ 1
20022
+ 1
20023
+ 1
20024
+ 1
20025
+ 1
20026
+ 1
20027
+ 1
20028
+ 1
20029
+ 1
20030
+ 1
20031
+ 1
20032
+ 1
20033
+ 1
20034
+ 1
20035
+ 1
20036
+ 1
20037
+ 1
20038
+ 1
20039
+ 1
20040
+ 1
20041
+ 1
20042
+ 1
20043
+ 1
20044
+ 1
20045
+ 1
20046
+ 1
20047
+ 1
20048
+ 1
20049
+ 1
20050
+ 1
20051
+ 1
20052
+ 1
20053
+ 1
20054
+ 1
20055
+ 1
20056
+ 1
20057
+ 1
20058
+ 1
20059
+ 1
20060
+ 1
20061
+ 1
20062
+ 1
20063
+ 1
20064
+ 1
20065
+ 1
20066
+ 1
20067
+ 1
20068
+ 1
20069
+ 1
20070
+ 1
20071
+ 1
20072
+ 1
20073
+ 1
20074
+ 1
20075
+ 1
20076
+ 1
20077
+ 1
20078
+ 1
20079
+ 1
20080
+ 1
20081
+ 1
20082
+ 1
20083
+ 1
20084
+ 1
20085
+ 1
20086
+ 1
20087
+ 1
20088
+ 1
20089
+ 1
20090
+ 1
20091
+ 1
20092
+ 1
20093
+ 1
20094
+ 1
20095
+ 1
20096
+ 1
20097
+ 1
20098
+ 1
20099
+ 1
20100
+ 1
20101
+ 1
20102
+ 1
20103
+ 1
20104
+ 1
20105
+ 1
20106
+ 1
20107
+ 1
20108
+ 1
20109
+ 1
20110
+ 1
20111
+ 1
20112
+ 1
20113
+ 1
20114
+ 1
20115
+ 1
20116
+ 1
20117
+ 1
20118
+ 1
20119
+ 1
20120
+ 1
20121
+ 1
20122
+ 1
20123
+ 1
20124
+ 1
20125
+ 1
20126
+ 1
20127
+ 1
20128
+ 1
20129
+ 1
20130
+ 1
20131
+ 1
20132
+ 1
20133
+ 1
20134
+ 1
20135
+ 1
20136
+ 1
20137
+ 1
20138
+ 1
20139
+ 1
20140
+ 1
20141
+ 1
20142
+ 1
20143
+ 1
20144
+ 1
20145
+ 1
20146
+ 1
20147
+ 1
20148
+ 1
20149
+ 1
20150
+ 1
20151
+ 1
20152
+ 1
20153
+ 1
20154
+ 1
20155
+ 1
20156
+ 1
20157
+ 1
20158
+ 1
20159
+ 1
20160
+ 1
20161
+ 1
20162
+ 1
20163
+ 1
20164
+ 1
20165
+ 1
20166
+ 1
20167
+ 1
20168
+ 1
20169
+ 1
20170
+ 1
20171
+ 1
20172
+ 1
20173
+ 1
20174
+ 1
20175
+ 1
20176
+ 1
20177
+ 1
20178
+ 1
20179
+ 1
20180
+ 1
20181
+ 1
20182
+ 1
20183
+ 1
20184
+ 1
20185
+ 1
20186
+ 1
20187
+ 1
20188
+ 1
20189
+ 1
20190
+ 1
20191
+ 1
20192
+ 1
20193
+ 1
20194
+ 1
20195
+ 1
20196
+ 1
20197
+ 1
20198
+ 1
20199
+ 1
20200
+ 1
20201
+ 1
20202
+ 1
20203
+ 1
20204
+ 1
20205
+ 1
20206
+ 1
20207
+ 1
20208
+ 1
20209
+ 1
20210
+ 1
20211
+ 1
20212
+ 1
20213
+ 1
20214
+ 1
20215
+ 1
20216
+ 1
20217
+ 1
20218
+ 1
20219
+ 1
20220
+ 1
20221
+ 1
20222
+ 1
20223
+ 1
20224
+ 1
20225
+ 1
20226
+ 1
20227
+ 1
20228
+ 1
20229
+ 1
20230
+ 1
20231
+ 1
20232
+ 1
20233
+ 1
20234
+ 1
20235
+ 1
20236
+ 1
20237
+ 1
20238
+ 1
20239
+ 1
20240
+ 1
20241
+ 1
20242
+ 1
20243
+ 1
20244
+ 1
20245
+ 1
20246
+ 1
20247
+ 1
20248
+ 1
20249
+ 1
20250
+ 1
20251
+ 1
20252
+ 1
20253
+ 1
20254
+ 1
20255
+ 1
20256
+ 1
20257
+ 1
20258
+ 1
20259
+ 1
20260
+ 1
20261
+ 1
20262
+ 1
20263
+ 1
20264
+ 1
20265
+ 1
20266
+ 1
20267
+ 1
20268
+ 1
20269
+ 1
20270
+ 1
20271
+ 1
20272
+ 1
20273
+ 1
20274
+ 1
20275
+ 1
20276
+ 1
20277
+ 1
20278
+ 1
20279
+ 1
20280
+ 1
20281
+ 1
20282
+ 1
20283
+ 1
20284
+ 1
20285
+ 1
20286
+ 1
20287
+ 1
20288
+ 1
20289
+ 1
20290
+ 1
20291
+ 1
20292
+ 1
20293
+ 1
20294
+ 1
20295
+ 1
20296
+ 1
20297
+ 1
20298
+ 1
20299
+ 1
20300
+ 1
20301
+ 1
20302
+ 1
20303
+ 1
20304
+ 1
20305
+ 1
20306
+ 1
20307
+ 1
20308
+ 1
20309
+ 1
20310
+ 1
20311
+ 1
20312
+ 1
20313
+ 1
20314
+ 1
20315
+ 1
20316
+ 1
20317
+ 1
20318
+ 1
20319
+ 1
20320
+ 1
20321
+ 1
20322
+ 1
20323
+ 1
20324
+ 1
20325
+ 1
20326
+ 1
20327
+ 1
20328
+ 1
20329
+ 1
20330
+ 1
20331
+ 1
20332
+ 1
20333
+ 1
20334
+ 1
20335
+ 1
20336
+ 1
20337
+ 1
20338
+ 1
20339
+ 1
20340
+ 1
20341
+ 1
20342
+ 1
20343
+ 1
20344
+ 1
20345
+ 1
20346
+ 1
20347
+ 1
20348
+ 1
20349
+ 1
20350
+ 1
20351
+ 1
20352
+ 1
20353
+ 1
20354
+ 1
20355
+ 1
20356
+ 1
20357
+ 1
20358
+ 1
20359
+ 1
20360
+ 1
20361
+ 1
20362
+ 1
20363
+ 1
20364
+ 1
20365
+ 1
20366
+ 1
20367
+ 1
20368
+ 1
20369
+ 1
20370
+ 1
20371
+ 1
20372
+ 1
20373
+ 1
20374
+ 1
20375
+ 1
20376
+ 1
20377
+ 1
20378
+ 1
20379
+ 1
20380
+ 1
20381
+ 1
20382
+ 1
20383
+ 1
20384
+ 1
20385
+ 1
20386
+ 1
20387
+ 1
20388
+ 1
20389
+ 1
20390
+ 1
20391
+ 1
20392
+ 1
20393
+ 1
20394
+ 1
20395
+ 1
20396
+ 1
20397
+ 1
20398
+ 1
20399
+ 1
20400
+ 1
20401
+ 1
20402
+ 1
20403
+ 1
20404
+ 1
20405
+ 1
20406
+ 1
20407
+ 1
20408
+ 1
20409
+ 1
20410
+ 1
20411
+ 1
20412
+ 1
20413
+ 1
20414
+ 1
20415
+ 1
20416
+ 1
20417
+ 1
20418
+ 1
20419
+ 1
20420
+ 1
20421
+ 1
20422
+ 1
20423
+ 1
20424
+ 1
20425
+ 1
20426
+ 1
20427
+ 1
20428
+ 1
20429
+ 1
20430
+ 1
20431
+ 1
20432
+ 1
20433
+ 1
20434
+ 1
20435
+ 1
20436
+ 1
20437
+ 1
20438
+ 1
20439
+ 1
20440
+ 1
20441
+ 1
20442
+ 1
20443
+ 1
20444
+ 1
20445
+ 1
20446
+ 1
20447
+ 1
20448
+ 1
20449
+ 1
20450
+ 1
20451
+ 1
20452
+ 1
20453
+ 1
20454
+ 1
20455
+ 1
20456
+ 1
20457
+ 1
20458
+ 1
20459
+ 1
20460
+ 1
20461
+ 1
20462
+ 1
20463
+ 1
20464
+ 1
20465
+ 1
20466
+ 1
20467
+ 1
20468
+ 1
20469
+ 1
20470
+ 1
20471
+ 1
20472
+ 1
20473
+ 1
20474
+ 1
20475
+ 1
20476
+ 1
20477
+ 1
20478
+ 1
20479
+ 1
20480
+ 1
20481
+ 1
20482
+ 1
20483
+ 1
20484
+ 1
20485
+ 1
20486
+ 1
20487
+ 1
20488
+ 1
20489
+ 1
20490
+ 1
20491
+ 1
20492
+ 1
20493
+ 1
20494
+ 1
20495
+ 1
20496
+ 1
20497
+ 1
20498
+ 1
20499
+ 1
20500
+ 1
20501
+ 1
20502
+ 1
20503
+ 1
20504
+ 1
20505
+ 1
20506
+ 1
20507
+ 1
20508
+ 1
20509
+ 1
20510
+ 1
20511
+ 1
20512
+ 1
20513
+ 1
20514
+ 1
20515
+ 1
20516
+ 1
20517
+ 1
20518
+ 1
20519
+ 1
20520
+ 1
20521
+ 1
20522
+ 1
20523
+ 1
20524
+ 1
20525
+ 1
20526
+ 1
20527
+ 1
20528
+ 1
20529
+ 1
20530
+ 1
20531
+ 1
20532
+ 1
20533
+ 1
20534
+ 1
20535
+ 1
20536
+ 1
20537
+ 1
20538
+ 1
20539
+ 1
20540
+ 1
20541
+ 1
20542
+ 1
20543
+ 1
20544
+ 1
20545
+ 1
20546
+ 1
20547
+ 1
20548
+ 1
20549
+ 1
20550
+ 1
20551
+ 1
20552
+ 1
20553
+ 1
20554
+ 1
20555
+ 1
20556
+ 1
20557
+ 1
20558
+ 1
20559
+ 1
20560
+ 1
20561
+ 1
20562
+ 1
20563
+ 1
20564
+ 1
20565
+ 1
20566
+ 1
20567
+ 1
20568
+ 1
20569
+ 1
20570
+ 1
20571
+ 1
20572
+ 1
20573
+ 1
20574
+ 1
20575
+ 1
20576
+ 1
20577
+ 1
20578
+ 1
20579
+ 1
20580
+ 1
20581
+ 1
20582
+ 1
20583
+ 1
20584
+ 1
20585
+ 1
20586
+ 1
20587
+ 1
20588
+ 1
20589
+ 1
20590
+ 1
20591
+ 1
20592
+ 1
20593
+ 1
20594
+ 1
20595
+ 1
20596
+ 1
20597
+ 1
20598
+ 1
20599
+ 1
20600
+ 1
20601
+ 1
20602
+ 1
20603
+ 1
20604
+ 1
20605
+ 1
20606
+ 1
20607
+ 1
20608
+ 1
20609
+ 1
20610
+ 1
20611
+ 1
20612
+ 1
20613
+ 1
20614
+ 1
20615
+ 1
20616
+ 1
20617
+ 1
20618
+ 1
20619
+ 1
20620
+ 1
20621
+ 1
20622
+ 1
20623
+ 1
20624
+ 1
20625
+ 1
20626
+ 1
20627
+ 1
20628
+ 1
20629
+ 1
20630
+ 1
20631
+ 1
20632
+ 1
20633
+ 1
20634
+ 1
20635
+ 1
20636
+ 1
20637
+ 1
20638
+ 1
20639
+ 1
20640
+ 1
20641
+ 1
20642
+ 1
20643
+ 1
20644
+ 1
20645
+ 1
20646
+ 1
20647
+ 1
20648
+ 1
20649
+ 1
20650
+ 1
20651
+ 1
20652
+ 1
20653
+ 1
20654
+ 1
20655
+ 1
20656
+ 1
20657
+ 1
20658
+ 1
20659
+ 1
20660
+ 1
20661
+ 1
20662
+ 1
20663
+ 1
20664
+ 1
20665
+ 1
20666
+ 1
20667
+ 1
20668
+ 1
20669
+ 1
20670
+ 1
20671
+ 1
20672
+ 1
20673
+ 1
20674
+ 1
20675
+ 1
20676
+ 1
20677
+ 1
20678
+ 1
20679
+ 1
20680
+ 1
20681
+ 1
20682
+ 1
20683
+ 1
20684
+ 1
20685
+ 1
20686
+ 1
20687
+ 1
20688
+ 1
20689
+ 1
20690
+ 1
20691
+ 1
20692
+ 1
20693
+ 1
20694
+ 1
20695
+ 1
20696
+ 1
20697
+ 1
20698
+ 1
20699
+ 1
20700
+ 1
20701
+ 1
20702
+ 1
20703
+ 1
20704
+ 1
20705
+ 1
20706
+ 1
20707
+ 1
20708
+ 1
20709
+ 1
20710
+ 1
20711
+ 1
20712
+ 1
20713
+ 1
20714
+ 1
20715
+ 1
20716
+ 1
20717
+ 1
20718
+ 1
20719
+ 1
20720
+ 1
20721
+ 1
20722
+ 1
20723
+ 1
20724
+ 1
20725
+ 1
20726
+ 1
20727
+ 1
20728
+ 1
20729
+ 1
20730
+ 1
20731
+ 1
20732
+ 1
20733
+ 1
20734
+ 1
20735
+ 1
20736
+ 1
20737
+ 1
20738
+ 1
20739
+ 1
20740
+ 1
20741
+ 1
20742
+ 1
20743
+ 1
20744
+ 1
20745
+ 1
20746
+ 1
20747
+ 1
20748
+ 1
20749
+ 1
20750
+ 1
20751
+ 1
20752
+ 1
20753
+ 1
20754
+ 1
20755
+ 1
20756
+ 1
20757
+ 1
20758
+ 1
20759
+ 1
20760
+ 1
20761
+ 1
20762
+ 1
20763
+ 1
20764
+ 1
20765
+ 1
20766
+ 1
20767
+ 1
20768
+ 1
20769
+ 1
20770
+ 1
20771
+ 1
20772
+ 1
20773
+ 1
20774
+ 1
20775
+ 1
20776
+ 1
20777
+ 1
20778
+ 1
20779
+ 1
20780
+ 1
20781
+ 1
20782
+ 1
20783
+ 1
20784
+ 1
20785
+ 1
20786
+ 1
20787
+ 1
20788
+ 1
20789
+ 1
20790
+ 1
20791
+ 1
20792
+ 1
20793
+ 1
20794
+ 1
20795
+ 1
20796
+ 1
20797
+ 1
20798
+ 1
20799
+ 1
20800
+ 1
20801
+ 1
20802
+ 1
20803
+ 1
20804
+ 1
20805
+ 1
20806
+ 1
20807
+ 1
20808
+ 1
20809
+ 1
20810
+ 1
20811
+ 1
20812
+ 1
20813
+ 1
20814
+ 1
20815
+ 1
20816
+ 1
20817
+ 1
20818
+ 1
20819
+ 1
20820
+ 1
20821
+ 1
20822
+ 1
20823
+ 1
20824
+ 1
20825
+ 1
20826
+ 1
20827
+ 1
20828
+ 1
20829
+ 1
20830
+ 1
20831
+ 1
20832
+ 1
20833
+ 1
20834
+ 1
20835
+ 1
20836
+ 1
20837
+ 1
20838
+ 1
20839
+ 1
20840
+ 1
20841
+ 1
20842
+ 1
20843
+ 1
20844
+ 1
20845
+ 1
20846
+ 1
20847
+ 1
20848
+ 1
20849
+ 1
20850
+ 1
20851
+ 1
20852
+ 1
20853
+ 1
20854
+ 1
20855
+ 1
20856
+ 1
20857
+ 1
20858
+ 1
20859
+ 1
20860
+ 1
20861
+ 1
20862
+ 1
20863
+ 1
20864
+ 1
20865
+ 1
20866
+ 1
20867
+ 1
20868
+ 1
20869
+ 1
20870
+ 1
20871
+ 1
20872
+ 1
20873
+ 1
20874
+ 1
20875
+ 1
20876
+ 1
20877
+ 1
20878
+ 1
20879
+ 1
20880
+ 1
20881
+ 1
20882
+ 1
20883
+ 1
20884
+ 1
20885
+ 1
20886
+ 1
20887
+ 1
20888
+ 1
20889
+ 1
20890
+ 1
20891
+ 1
20892
+ 1
20893
+ 1
20894
+ 1
20895
+ 1
20896
+ 1
20897
+ 1
20898
+ 1
20899
+ 1
20900
+ 1
20901
+ 1
20902
+ 1
20903
+ 1
20904
+ 1
20905
+ 1
20906
+ 1
20907
+ 1
20908
+ 1
20909
+ 1
20910
+ 1
20911
+ 1
20912
+ 1
20913
+ 1
20914
+ 1
20915
+ 1
20916
+ 1
20917
+ 1
20918
+ 1
20919
+ 1
20920
+ 1
20921
+ 1
20922
+ 1
20923
+ 1
20924
+ 1
20925
+ 1
20926
+ 1
20927
+ 1
20928
+ 1
20929
+ 1
20930
+ 1
20931
+ 1
20932
+ 1
20933
+ 1
20934
+ 1
20935
+ 1
20936
+ 1
20937
+ 1
20938
+ 1
20939
+ 1
20940
+ 1
20941
+ 1
20942
+ 1
20943
+ 1
20944
+ 1
20945
+ 1
20946
+ 1
20947
+ 1
20948
+ 1
20949
+ 1
20950
+ 1
20951
+ 1
20952
+ 1
20953
+ 1
20954
+ 1
20955
+ 1
20956
+ 1
20957
+ 1
20958
+ 1
20959
+ 1
20960
+ 1
20961
+ 1
20962
+ 1
20963
+ 1
20964
+ 1
20965
+ 1
20966
+ 1
20967
+ 1
20968
+ 1
20969
+ 1
20970
+ 1
20971
+ 1
20972
+ 1
20973
+ 1
20974
+ 1
20975
+ 1
20976
+ 1
20977
+ 1
20978
+ 1
20979
+ 1
20980
+ 1
20981
+ 1
20982
+ 1
20983
+ 1
20984
+ 1
20985
+ 1
20986
+ 1
20987
+ 1
20988
+ 1
20989
+ 1
20990
+ 1
20991
+ 1
20992
+ 1
20993
+ 1
20994
+ 1
20995
+ 1
20996
+ 1
20997
+ 1
20998
+ 1
20999
+ 1
21000
+ 1
21001
+ 1
21002
+ 1
21003
+ 1
21004
+ 1
21005
+ 1
21006
+ 1
21007
+ 1
21008
+ 1
21009
+ 1
21010
+ 1
21011
+ 1
21012
+ 1
21013
+ 1
21014
+ 1
21015
+ 1
21016
+ 1
21017
+ 1
21018
+ 1
21019
+ 1
21020
+ 1
21021
+ 1
21022
+ 1
21023
+ 1
21024
+ 1
21025
+ 1
21026
+ 1
21027
+ 1
21028
+ 1
21029
+ 1
21030
+ 1
21031
+ 1
21032
+ 1
21033
+ 1
21034
+ 1
21035
+ 1
21036
+ 1
21037
+ 1
21038
+ 1
21039
+ 1
21040
+ 1
21041
+ 1
21042
+ 1
21043
+ 1
21044
+ 1
21045
+ 1
21046
+ 1
21047
+ 1
21048
+ 1
21049
+ 1
21050
+ 1
21051
+ 1
21052
+ 1
21053
+ 1
21054
+ 1
21055
+ 1
21056
+ 1
21057
+ 1
21058
+ 1
21059
+ 1
21060
+ 1
21061
+ 1
21062
+ 1
21063
+ 1
21064
+ 1
21065
+ 1
21066
+ 1
21067
+ 1
21068
+ 1
21069
+ 1
21070
+ 1
21071
+ 1
21072
+ 1
21073
+ 1
21074
+ 1
21075
+ 1
21076
+ 1
21077
+ 1
21078
+ 1
21079
+ 1
21080
+ 1
21081
+ 1
21082
+ 1
21083
+ 1
21084
+ 1
21085
+ 1
21086
+ 1
21087
+ 1
21088
+ 1
21089
+ 1
21090
+ 1
21091
+ 1
21092
+ 1
21093
+ 1
21094
+ 1
21095
+ 1
21096
+ 1
21097
+ 1
21098
+ 1
21099
+ 1
21100
+ 1
21101
+ 1
21102
+ 1
21103
+ 1
21104
+ 1
21105
+ 1
21106
+ 1
21107
+ 1
21108
+ 1
21109
+ 1
21110
+ 1
21111
+ 1
21112
+ 1
21113
+ 1
21114
+ 1
21115
+ 1
21116
+ 1
21117
+ 1
21118
+ 1
21119
+ 1
21120
+ 1
21121
+ 1
21122
+ 1
21123
+ 1
21124
+ 1
21125
+ 1
21126
+ 1
21127
+ 1
21128
+ 1
21129
+ 1
21130
+ 1
21131
+ 1
21132
+ 1
21133
+ 1
21134
+ 1
21135
+ 1
21136
+ 1
21137
+ 1
21138
+ 1
21139
+ 1
21140
+ 1
21141
+ 1
21142
+ 1
21143
+ 1
21144
+ 1
21145
+ 1
21146
+ 1
21147
+ 1
21148
+ 1
21149
+ 1
21150
+ 1
21151
+ 1
21152
+ 1
21153
+ 1
21154
+ 1
21155
+ 1
21156
+ 1
21157
+ 1
21158
+ 1
21159
+ 1
21160
+ 1
21161
+ 1
21162
+ 1
21163
+ 1
21164
+ 1
21165
+ 1
21166
+ 1
21167
+ 1
21168
+ 1
21169
+ 1
21170
+ 1
21171
+ 1
21172
+ 1
21173
+ 1
21174
+ 1
21175
+ 1
21176
+ 1
21177
+ 2
21178
+ 1
21179
+ 1
21180
+ 1
21181
+ 2
21182
+ 1
21183
+ 1
21184
+ 1
21185
+ 1
21186
+ 1
21187
+ 1
21188
+ 1
21189
+ 1
21190
+ 1
21191
+ 2
21192
+ 1
21193
+ 1
21194
+ 1
21195
+ 1
21196
+ 1
21197
+ 1
21198
+ 1
21199
+ 1
21200
+ 1
21201
+ 1
21202
+ 1
21203
+ 1
21204
+ 1
21205
+ 1
21206
+ 1
21207
+ 1
21208
+ 1
21209
+ 1
21210
+ 1
21211
+ 1
21212
+ 1
21213
+ 1
21214
+ 1
21215
+ 1
21216
+ 1
21217
+ 1
21218
+ 1
21219
+ 1
21220
+ 1
21221
+ 1
21222
+ 1
21223
+ 1
21224
+ 1
21225
+ 1
21226
+ 1
21227
+ 1
21228
+ 1
21229
+ 1
21230
+ 1
21231
+ 1
21232
+ 1
21233
+ 1
21234
+ 1
21235
+ 1
21236
+ 1
21237
+ 1
21238
+ 1
21239
+ 1
21240
+ 1
21241
+ 1
21242
+ 1
21243
+ 1
21244
+ 1
21245
+ 1
21246
+ 1
21247
+ 1
21248
+ 1
21249
+ 1
21250
+ 1
21251
+ 1
21252
+ 1
21253
+ 1
21254
+ 1
21255
+ 1
21256
+ 1
21257
+ 1
21258
+ 1
21259
+ 1
21260
+ 1
21261
+ 1
21262
+ 1
21263
+ 1
21264
+ 1
21265
+ 1
21266
+ 1
21267
+ 1
21268
+ 1
21269
+ 1
21270
+ 1
21271
+ 1
21272
+ 1
21273
+ 1
21274
+ 1
21275
+ 1
21276
+ 1
21277
+ 1
21278
+ 1
21279
+ 1
21280
+ 1
21281
+ 1
21282
+ 1
21283
+ 1
21284
+ 1
21285
+ 1
21286
+ 1
21287
+ 1
21288
+ 1
21289
+ 1
21290
+ 1
21291
+ 1
21292
+ 1
21293
+ 1
21294
+ 1
21295
+ 1
21296
+ 1
21297
+ 1
21298
+ 1
21299
+ 1
21300
+ 1
21301
+ 1
21302
+ 1
21303
+ 1
21304
+ 1
21305
+ 1
21306
+ 1
21307
+ 1
21308
+ 1
21309
+ 1
21310
+ 1
21311
+ 1
21312
+ 1
21313
+ 1
21314
+ 1
21315
+ 1
21316
+ 1
21317
+ 1
21318
+ 1
21319
+ 1
21320
+ 1
21321
+ 1
21322
+ 1
21323
+ 1
21324
+ 1
21325
+ 1
21326
+ 1
21327
+ 1
21328
+ 1
21329
+ 1
21330
+ 1
21331
+ 1
21332
+ 1
21333
+ 1
21334
+ 1
21335
+ 1
21336
+ 1
21337
+ 1
21338
+ 1
21339
+ 1
21340
+ 1
21341
+ 1
21342
+ 1
21343
+ 1
21344
+ 1
21345
+ 1
21346
+ 1
21347
+ 1
21348
+ 1
21349
+ 1
21350
+ 1
21351
+ 1
21352
+ 1
21353
+ 1
21354
+ 1
21355
+ 1
21356
+ 1
21357
+ 1
21358
+ 1
21359
+ 1
21360
+ 1
21361
+ 1
21362
+ 1
21363
+ 1
21364
+ 1
21365
+ 1
21366
+ 1
21367
+ 1
21368
+ 1
21369
+ 1
21370
+ 1
21371
+ 1
21372
+ 1
21373
+ 1
21374
+ 1
21375
+ 1
21376
+ 1
21377
+ 1
21378
+ 1
21379
+ 1
21380
+ 1
21381
+ 1
21382
+ 1
21383
+ 1
21384
+ 1
21385
+ 1
21386
+ 1
21387
+ 1
21388
+ 1
21389
+ 1
21390
+ 1
21391
+ 1
21392
+ 1
21393
+ 1
21394
+ 1
21395
+ 1
21396
+ 1
21397
+ 1
21398
+ 1
21399
+ 1
21400
+ 1
21401
+ 1
21402
+ 1
21403
+ 1
21404
+ 1
21405
+ 1
21406
+ 1
21407
+ 1
21408
+ 1
21409
+ 1
21410
+ 1
21411
+ 1
21412
+ 1
21413
+ 1
21414
+ 1
21415
+ 1
21416
+ 1
21417
+ 1
21418
+ 1
21419
+ 1
21420
+ 1
21421
+ 1
21422
+ 1
21423
+ 1
21424
+ 1
21425
+ 1
21426
+ 1
21427
+ 1
21428
+ 1
21429
+ 1
21430
+ 1
21431
+ 1
21432
+ 1
21433
+ 1
21434
+ 1
21435
+ 1
21436
+ 1
21437
+ 1
21438
+ 1
21439
+ 1
21440
+ 1
21441
+ 1
21442
+ 1
21443
+ 1
21444
+ 1
21445
+ 1
21446
+ 1
21447
+ 1
21448
+ 1
21449
+ 1
21450
+ 1
21451
+ 1
21452
+ 1
21453
+ 1
21454
+ 1
21455
+ 1
21456
+ 1
21457
+ 1
21458
+ 1
21459
+ 1
21460
+ 1
21461
+ 1
21462
+ 1
21463
+ 1
21464
+ 1
21465
+ 1
21466
+ 1
21467
+ 1
21468
+ 1
21469
+ 1
21470
+ 1
21471
+ 1
21472
+ 1
21473
+ 1
21474
+ 1
21475
+ 1
21476
+ 1
21477
+ 1
21478
+ 1
21479
+ 1
21480
+ 1
21481
+ 1
21482
+ 1
21483
+ 1
21484
+ 1
21485
+ 1
21486
+ 1
21487
+ 1
21488
+ 1
21489
+ 1
21490
+ 1
21491
+ 1
21492
+ 1
21493
+ 1
21494
+ 1
21495
+ 1
21496
+ 1
21497
+ 1
21498
+ 1
21499
+ 1
21500
+ 1
21501
+ 1
21502
+ 1
21503
+ 1
21504
+ 1
21505
+ 1
21506
+ 1
21507
+ 1
21508
+ 1
21509
+ 1
21510
+ 1
21511
+ 1
21512
+ 1
21513
+ 1
21514
+ 1
21515
+ 1
21516
+ 1
21517
+ 1
21518
+ 1
21519
+ 1
21520
+ 1
21521
+ 1
21522
+ 1
21523
+ 1
21524
+ 1
21525
+ 1
21526
+ 1
21527
+ 1
21528
+ 1
21529
+ 1
21530
+ 1
21531
+ 1
21532
+ 1
21533
+ 1
21534
+ 1
21535
+ 1
21536
+ 1
21537
+ 1
21538
+ 1
21539
+ 1
21540
+ 1
21541
+ 1
21542
+ 1
21543
+ 1
21544
+ 1
21545
+ 1
21546
+ 1
21547
+ 1
21548
+ 1
21549
+ 1
21550
+ 1
21551
+ 1
21552
+ 1
21553
+ 1
21554
+ 1
21555
+ 1
21556
+ 1
21557
+ 1
21558
+ 1
21559
+ 1
21560
+ 1
21561
+ 1
21562
+ 1
21563
+ 1
21564
+ 1
21565
+ 1
21566
+ 1
21567
+ 1
21568
+ 1
21569
+ 1
21570
+ 1
21571
+ 1
21572
+ 1
21573
+ 1
21574
+ 1
21575
+ 1
21576
+ 1
21577
+ 1
21578
+ 1
21579
+ 1
21580
+ 1
21581
+ 1
21582
+ 1
21583
+ 1
21584
+ 1
21585
+ 1
21586
+ 1
21587
+ 1
21588
+ 1
21589
+ 1
21590
+ 1
21591
+ 1
21592
+ 1
21593
+ 1
21594
+ 1
21595
+ 1
21596
+ 1
21597
+ 1
21598
+ 1
21599
+ 1
21600
+ 1
21601
+ 1
21602
+ 1
21603
+ 1
21604
+ 1
21605
+ 1
21606
+ 1
21607
+ 1
21608
+ 1
21609
+ 1
21610
+ 1
21611
+ 1
21612
+ 1
21613
+ 1
21614
+ 1
21615
+ 1
21616
+ 1
21617
+ 1
21618
+ 1
21619
+ 1
21620
+ 1
21621
+ 1
21622
+ 1
21623
+ 1
21624
+ 1
21625
+ 1
21626
+ 1
21627
+ 1
21628
+ 1
21629
+ 1
21630
+ 1
21631
+ 1
21632
+ 1
21633
+ 1
21634
+ 1
21635
+ 1
21636
+ 1
21637
+ 1
21638
+ 1
21639
+ 1
21640
+ 1
21641
+ 1
21642
+ 1
21643
+ 1
21644
+ 1
21645
+ 1
21646
+ 1
21647
+ 1
21648
+ 1
21649
+ 1
21650
+ 1
21651
+ 1
21652
+ 1
21653
+ 1
21654
+ 1
21655
+ 1
21656
+ 1
21657
+ 1
21658
+ 1
21659
+ 1
21660
+ 1
21661
+ 1
21662
+ 1
21663
+ 1
21664
+ 1
21665
+ 1
21666
+ 1
21667
+ 1
21668
+ 1
21669
+ 1
21670
+ 1
21671
+ 1
21672
+ 1
21673
+ 1
21674
+ 1
21675
+ 1
21676
+ 1
21677
+ 1
21678
+ 1
21679
+ 1
21680
+ 1
21681
+ 1
21682
+ 1
21683
+ 1
21684
+ 1
21685
+ 1
21686
+ 1
21687
+ 1
21688
+ 1
21689
+ 1
21690
+ 1
21691
+ 1
21692
+ 1
21693
+ 1
21694
+ 1
21695
+ 1
21696
+ 1
21697
+ 1
21698
+ 1
21699
+ 1
21700
+ 1
21701
+ 1
21702
+ 1
21703
+ 1
21704
+ 1
21705
+ 1
21706
+ 1
21707
+ 1
21708
+ 1
21709
+ 1
21710
+ 1
21711
+ 1
21712
+ 1
21713
+ 1
21714
+ 1
21715
+ 1
21716
+ 1
21717
+ 1
21718
+ 1
21719
+ 1
21720
+ 1
21721
+ 1
21722
+ 1
21723
+ 1
21724
+ 1
21725
+ 1
21726
+ 1
21727
+ 1
21728
+ 1
21729
+ 1
21730
+ 1
21731
+ 1
21732
+ 1
21733
+ 1
21734
+ 1
21735
+ 1
21736
+ 1
21737
+ 1
21738
+ 1
21739
+ 1
21740
+ 1
21741
+ 1
21742
+ 1
21743
+ 1
21744
+ 1
21745
+ 1
21746
+ 1
21747
+ 1
21748
+ 1
21749
+ 1
21750
+ 1
21751
+ 1
21752
+ 1
21753
+ 1
21754
+ 1
21755
+ 1
21756
+ 1
21757
+ 1
21758
+ 1
21759
+ 1
21760
+ 1
21761
+ 1
21762
+ 1
21763
+ 1
21764
+ 1
21765
+ 1
21766
+ 1
21767
+ 1
21768
+ 1
21769
+ 1
21770
+ 1
21771
+ 1
21772
+ 1
21773
+ 1
21774
+ 1
21775
+ 1
21776
+ 1
21777
+ 1
21778
+ 1
21779
+ 1
21780
+ 1
21781
+ 1
21782
+ 1
21783
+ 1
21784
+ 1
21785
+ 1
21786
+ 1
21787
+ 1
21788
+ 1
21789
+ 1
21790
+ 1
21791
+ 1
21792
+ 1
21793
+ 1
21794
+ 1
21795
+ 1
21796
+ 1
21797
+ 1
21798
+ 1
21799
+ 1
21800
+ 1
21801
+ 1
21802
+ 1
21803
+ 2
21804
+ 2
21805
+ 1
21806
+ 1
21807
+ 2
21808
+ 1
21809
+ 1
21810
+ 1
21811
+ 1
21812
+ 1
21813
+ 1
21814
+ 1
21815
+ 1
21816
+ 1
21817
+ 1
21818
+ 1
21819
+ 1
21820
+ 1
21821
+ 1
21822
+ 1
21823
+ 1
21824
+ 1
21825
+ 1
21826
+ 1
21827
+ 1
21828
+ 1
21829
+ 1
21830
+ 1
21831
+ 1
21832
+ 1
21833
+ 1
21834
+ 1
21835
+ 1
21836
+ 1
21837
+ 1
21838
+ 1
21839
+ 1
21840
+ 1
21841
+ 1
21842
+ 1
21843
+ 1
21844
+ 1
21845
+ 1
21846
+ 1
21847
+ 1
21848
+ 1
21849
+ 1
21850
+ 1
21851
+ 1
21852
+ 1
21853
+ 1
21854
+ 1
21855
+ 1
21856
+ 1
21857
+ 1
21858
+ 1
21859
+ 1
21860
+ 1
21861
+ 1
21862
+ 1
21863
+ 1
21864
+ 1
21865
+ 1
21866
+ 1
21867
+ 1
21868
+ 1
21869
+ 1
21870
+ 1
21871
+ 1
21872
+ 1
21873
+ 1
21874
+ 1
21875
+ 1
21876
+ 1
21877
+ 1
21878
+ 1
21879
+ 1
21880
+ 1
21881
+ 1
21882
+ 1
21883
+ 1
21884
+ 1
21885
+ 1
21886
+ 1
21887
+ 1
21888
+ 1
21889
+ 1
21890
+ 1
21891
+ 1
21892
+ 1
21893
+ 1
21894
+ 1
21895
+ 1
21896
+ 1
21897
+ 1
21898
+ 1
21899
+ 1
21900
+ 1
21901
+ 1
21902
+ 1
21903
+ 1
21904
+ 1
21905
+ 1
21906
+ 1
21907
+ 1
21908
+ 1
21909
+ 1
21910
+ 1
21911
+ 1
21912
+ 1
21913
+ 1
21914
+ 1
21915
+ 1
21916
+ 1
21917
+ 1
21918
+ 1
21919
+ 1
21920
+ 1
21921
+ 1
21922
+ 1
21923
+ 1
21924
+ 1
21925
+ 1
21926
+ 1
21927
+ 1
21928
+ 1
21929
+ 1
21930
+ 1
21931
+ 1
21932
+ 1
21933
+ 1
21934
+ 1
21935
+ 1
21936
+ 1
21937
+ 1
21938
+ 1
21939
+ 1
21940
+ 1
21941
+ 1
21942
+ 1
21943
+ 1
21944
+ 1
21945
+ 1
21946
+ 1
21947
+ 1
21948
+ 1
21949
+ 1
21950
+ 1
21951
+ 1
21952
+ 1
21953
+ 1
21954
+ 1
21955
+ 1
21956
+ 1
21957
+ 1
21958
+ 1
21959
+ 1
21960
+ 1
21961
+ 1
21962
+ 1
21963
+ 1
21964
+ 1
21965
+ 1
21966
+ 1
21967
+ 1
21968
+ 1
21969
+ 1
21970
+ 1
21971
+ 1
21972
+ 1
21973
+ 1
21974
+ 1
21975
+ 1
21976
+ 1
21977
+ 1
21978
+ 1
21979
+ 1
21980
+ 1
21981
+ 1
21982
+ 1
21983
+ 1
21984
+ 1
21985
+ 1
21986
+ 1
21987
+ 1
21988
+ 1
21989
+ 1
21990
+ 1
21991
+ 1
21992
+ 1
21993
+ 1
21994
+ 1
21995
+ 1
21996
+ 1
21997
+ 1
21998
+ 1
21999
+ 1
22000
+ 1
22001
+ 1
22002
+ 1
22003
+ 1
22004
+ 1
22005
+ 1
22006
+ 1
22007
+ 1
22008
+ 1
22009
+ 1
22010
+ 1
22011
+ 1
22012
+ 1
22013
+ 1
22014
+ 1
22015
+ 1
22016
+ 1
22017
+ 1
22018
+ 1
22019
+ 1
22020
+ 1
22021
+ 1
22022
+ 1
22023
+ 1
22024
+ 1
22025
+ 1
22026
+ 1
22027
+ 1
22028
+ 1
22029
+ 1
22030
+ 1
22031
+ 1
22032
+ 1
22033
+ 1
22034
+ 1
22035
+ 1
22036
+ 1
22037
+ 1
22038
+ 1
22039
+ 1
22040
+ 1
22041
+ 1
22042
+ 1
22043
+ 1
22044
+ 1
22045
+ 1
22046
+ 1
22047
+ 1
22048
+ 1
22049
+ 1
22050
+ 1
22051
+ 1
22052
+ 1
22053
+ 1
22054
+ 1
22055
+ 1
22056
+ 1
22057
+ 1
22058
+ 1
22059
+ 1
22060
+ 1
22061
+ 1
22062
+ 1
22063
+ 1
22064
+ 1
22065
+ 1
22066
+ 1
22067
+ 1
22068
+ 1
22069
+ 1
22070
+ 1
22071
+ 1
22072
+ 1
22073
+ 1
22074
+ 1
22075
+ 1
22076
+ 1
22077
+ 1
22078
+ 1
22079
+ 1
22080
+ 1
22081
+ 1
22082
+ 1
22083
+ 1
22084
+ 1
22085
+ 1
22086
+ 1
22087
+ 1
22088
+ 1
22089
+ 1
22090
+ 1
22091
+ 1
22092
+ 1
22093
+ 1
22094
+ 1
22095
+ 1
22096
+ 1
22097
+ 1
22098
+ 1
22099
+ 1
22100
+ 1
22101
+ 1
22102
+ 1
22103
+ 1
22104
+ 1
22105
+ 1
22106
+ 1
22107
+ 1
22108
+ 1
22109
+ 1
22110
+ 1
22111
+ 1
22112
+ 1
22113
+ 1
22114
+ 1
22115
+ 1
22116
+ 1
22117
+ 1
22118
+ 1
22119
+ 1
22120
+ 1
22121
+ 1
22122
+ 1
22123
+ 1
22124
+ 1
22125
+ 1
22126
+ 1
22127
+ 1
22128
+ 1
22129
+ 1
22130
+ 1
22131
+ 1
22132
+ 1
22133
+ 1
22134
+ 1
22135
+ 1
22136
+ 1
22137
+ 1
22138
+ 1
22139
+ 1
22140
+ 1
22141
+ 1
22142
+ 1
22143
+ 1
22144
+ 1
22145
+ 1
22146
+ 1
22147
+ 1
22148
+ 1
22149
+ 1
22150
+ 1
22151
+ 1
22152
+ 1
22153
+ 1
22154
+ 1
22155
+ 1
22156
+ 1
22157
+ 1
22158
+ 1
22159
+ 1
22160
+ 1
22161
+ 1
22162
+ 1
22163
+ 1
22164
+ 1
22165
+ 1
22166
+ 1
22167
+ 1
22168
+ 1
22169
+ 1
22170
+ 1
22171
+ 1
22172
+ 1
22173
+ 1
22174
+ 1
22175
+ 1
22176
+ 1
22177
+ 1
22178
+ 1
22179
+ 1
22180
+ 1
22181
+ 1
22182
+ 1
22183
+ 1
22184
+ 1
22185
+ 1
22186
+ 1
22187
+ 1
22188
+ 1
22189
+ 1
22190
+ 1
22191
+ 1
22192
+ 1
22193
+ 1
22194
+ 1
22195
+ 1
22196
+ 1
22197
+ 1
22198
+ 1
22199
+ 1
22200
+ 1
22201
+ 1
22202
+ 1
22203
+ 1
22204
+ 1
22205
+ 1
22206
+ 1
22207
+ 1
22208
+ 1
22209
+ 1
22210
+ 1
22211
+ 1
22212
+ 1
22213
+ 1
22214
+ 1
22215
+ 1
22216
+ 1
22217
+ 1
22218
+ 1
22219
+ 1
22220
+ 1
22221
+ 1
22222
+ 1
22223
+ 1
22224
+ 1
22225
+ 1
22226
+ 1
22227
+ 1
22228
+ 1
22229
+ 1
22230
+ 1
22231
+ 1
22232
+ 1
22233
+ 1
22234
+ 1
22235
+ 1
22236
+ 1
22237
+ 1
22238
+ 1
22239
+ 1
22240
+ 1
22241
+ 1
22242
+ 1
22243
+ 1
22244
+ 1
22245
+ 1
22246
+ 1
22247
+ 1
22248
+ 1
22249
+ 1
22250
+ 1
22251
+ 1
22252
+ 1
22253
+ 1
22254
+ 1
22255
+ 1
22256
+ 1
22257
+ 1
22258
+ 1
22259
+ 1
22260
+ 1
22261
+ 1
22262
+ 1
22263
+ 1
22264
+ 1
22265
+ 1
22266
+ 1
22267
+ 1
22268
+ 1
22269
+ 1
22270
+ 1
22271
+ 1
22272
+ 1
22273
+ 1
22274
+ 1
22275
+ 1
22276
+ 1
22277
+ 1
22278
+ 1
22279
+ 1
22280
+ 1
22281
+ 1
22282
+ 1
22283
+ 1
22284
+ 1
22285
+ 1
22286
+ 1
22287
+ 1
22288
+ 1
22289
+ 1
22290
+ 1
22291
+ 1
22292
+ 1
22293
+ 1
22294
+ 1
22295
+ 1
22296
+ 1
22297
+ 1
22298
+ 1
22299
+ 1
22300
+ 1
22301
+ 1
22302
+ 1
22303
+ 1
22304
+ 1
22305
+ 1
22306
+ 1
22307
+ 1
22308
+ 1
22309
+ 1
22310
+ 1
22311
+ 1
22312
+ 1
22313
+ 1
22314
+ 1
22315
+ 1
22316
+ 1
22317
+ 1
22318
+ 1
22319
+ 1
22320
+ 1
22321
+ 1
22322
+ 1
22323
+ 1
22324
+ 1
22325
+ 1
22326
+ 1
22327
+ 1
22328
+ 1
22329
+ 1
22330
+ 1
22331
+ 1
22332
+ 1
22333
+ 1
22334
+ 1
22335
+ 1
22336
+ 1
22337
+ 1
22338
+ 1
22339
+ 1
22340
+ 1
22341
+ 1
22342
+ 1
22343
+ 1
22344
+ 1
22345
+ 1
22346
+ 1
22347
+ 1
22348
+ 1
22349
+ 1
22350
+ 1
22351
+ 1
22352
+ 1
22353
+ 1
22354
+ 1
22355
+ 1
22356
+ 1
22357
+ 1
22358
+ 1
22359
+ 1
22360
+ 1
22361
+ 1
22362
+ 1
22363
+ 1
22364
+ 1
22365
+ 1
22366
+ 1
22367
+ 1
22368
+ 1
22369
+ 1
22370
+ 1
22371
+ 1
22372
+ 1
22373
+ 1
22374
+ 1
22375
+ 1
22376
+ 1
22377
+ 1
22378
+ 1
22379
+ 1
22380
+ 1
22381
+ 1
22382
+ 1
22383
+ 1
22384
+ 1
22385
+ 1
22386
+ 1
22387
+ 1
22388
+ 1
22389
+ 1
22390
+ 1
22391
+ 1
22392
+ 1
22393
+ 1
22394
+ 1
22395
+ 1
22396
+ 1
22397
+ 1
22398
+ 1
22399
+ 1
22400
+ 1
22401
+ 1
22402
+ 1
22403
+ 1
22404
+ 1
22405
+ 1
22406
+ 1
22407
+ 1
22408
+ 1
22409
+ 1
22410
+ 1
22411
+ 1
22412
+ 1
22413
+ 1
22414
+ 1
22415
+ 1
22416
+ 1
22417
+ 1
22418
+ 1
22419
+ 1
22420
+ 1
22421
+ 1
22422
+ 1
22423
+ 1
22424
+ 1
22425
+ 1
22426
+ 1
22427
+ 1
22428
+ 1
22429
+ 1
22430
+ 1
22431
+ 1
22432
+ 1
22433
+ 1
22434
+ 1
22435
+ 1
22436
+ 1
22437
+ 1
22438
+ 1
22439
+ 1
22440
+ 1
22441
+ 1
22442
+ 1
22443
+ 1
22444
+ 1
22445
+ 1
22446
+ 1
22447
+ 1
22448
+ 1
22449
+ 1
22450
+ 1
22451
+ 1
22452
+ 1
22453
+ 1
22454
+ 1
22455
+ 1
22456
+ 1
22457
+ 1
22458
+ 1
22459
+ 1
22460
+ 1
22461
+ 1
22462
+ 1
22463
+ 1
22464
+ 1
22465
+ 1
22466
+ 1
22467
+ 1
22468
+ 1
22469
+ 1
22470
+ 1
22471
+ 1
22472
+ 1
22473
+ 1
22474
+ 1
22475
+ 1
22476
+ 1
22477
+ 1
22478
+ 1
22479
+ 1
22480
+ 1
22481
+ 1
22482
+ 1
22483
+ 1
22484
+ 1
22485
+ 1
22486
+ 1
22487
+ 1
22488
+ 1
22489
+ 1
22490
+ 1
22491
+ 1
22492
+ 1
22493
+ 1
22494
+ 1
22495
+ 1
22496
+ 1
22497
+ 1
22498
+ 1
22499
+ 1
22500
+ 1
22501
+ 1
22502
+ 1
22503
+ 1
22504
+ 1
22505
+ 1
22506
+ 1
22507
+ 1
22508
+ 1
22509
+ 1
22510
+ 1
22511
+ 1
22512
+ 1
22513
+ 1
22514
+ 1
22515
+ 1
22516
+ 1
22517
+ 1
22518
+ 1
22519
+ 1
22520
+ 1
22521
+ 1
22522
+ 1
22523
+ 1
22524
+ 1
22525
+ 1
22526
+ 1
22527
+ 1
22528
+ 1
22529
+ 1
22530
+ 1
22531
+ 1
22532
+ 1
22533
+ 1
22534
+ 1
22535
+ 1
22536
+ 1
22537
+ 1
22538
+ 1
22539
+ 1
22540
+ 1
22541
+ 1
22542
+ 1
22543
+ 1
22544
+ 1
22545
+ 1
22546
+ 1
22547
+ 1
22548
+ 1
22549
+ 1
22550
+ 1
22551
+ 1
22552
+ 1
22553
+ 1
22554
+ 1
22555
+ 1
22556
+ 1
22557
+ 1
22558
+ 1
22559
+ 1
22560
+ 1
22561
+ 1
22562
+ 1
22563
+ 1
22564
+ 1
22565
+ 1
22566
+ 1
22567
+ 1
22568
+ 1
22569
+ 1
22570
+ 1
22571
+ 1
22572
+ 1
22573
+ 1
22574
+ 1
22575
+ 1
22576
+ 1
22577
+ 1
22578
+ 1
22579
+ 1
22580
+ 1
22581
+ 1
22582
+ 1
22583
+ 1
22584
+ 1
22585
+ 2
22586
+ 1
22587
+ 1
22588
+ 1
22589
+ 1
22590
+ 1
22591
+ 1
22592
+ 1
22593
+ 1
22594
+ 1
22595
+ 1
22596
+ 1
22597
+ 1
22598
+ 1
22599
+ 1
22600
+ 1
22601
+ 1
22602
+ 1
22603
+ 1
22604
+ 1
22605
+ 1
22606
+ 1
22607
+ 1
22608
+ 1
22609
+ 1
22610
+ 1
22611
+ 1
22612
+ 1
22613
+ 1
22614
+ 1
22615
+ 1
22616
+ 1
22617
+ 1
22618
+ 1
22619
+ 1
22620
+ 1
22621
+ 1
22622
+ 1
22623
+ 1
22624
+ 1
22625
+ 1
22626
+ 1
22627
+ 1
22628
+ 1
22629
+ 1
22630
+ 1
22631
+ 1
22632
+ 1
22633
+ 1
22634
+ 1
22635
+ 1
22636
+ 1
22637
+ 1
22638
+ 1
22639
+ 1
22640
+ 1
22641
+ 1
22642
+ 1
22643
+ 1
22644
+ 1
22645
+ 1
22646
+ 1
22647
+ 1
22648
+ 1
22649
+ 1
22650
+ 1
22651
+ 1
22652
+ 1
22653
+ 1
22654
+ 1
22655
+ 1
22656
+ 1
22657
+ 1
22658
+ 1
22659
+ 1
22660
+ 1
22661
+ 1
22662
+ 1
22663
+ 1
22664
+ 1
22665
+ 1
22666
+ 1
22667
+ 1
22668
+ 1
22669
+ 1
22670
+ 1
22671
+ 1
22672
+ 1
22673
+ 1
22674
+ 1
22675
+ 1
22676
+ 1
22677
+ 1
22678
+ 1
22679
+ 1
22680
+ 1
22681
+ 1
22682
+ 1
22683
+ 1
22684
+ 1
22685
+ 1
22686
+ 1
22687
+ 1
22688
+ 1
22689
+ 1
22690
+ 1
22691
+ 1
22692
+ 1
22693
+ 1
22694
+ 1
22695
+ 1
22696
+ 1
22697
+ 1
22698
+ 1
22699
+ 1
22700
+ 1
22701
+ 1
22702
+ 1
22703
+ 1
22704
+ 1
22705
+ 1
22706
+ 1
22707
+ 1
22708
+ 1
22709
+ 1
22710
+ 1
22711
+ 1
22712
+ 1
22713
+ 1
22714
+ 1
22715
+ 1
22716
+ 1
22717
+ 1
22718
+ 1
22719
+ 1
22720
+ 1
22721
+ 1
22722
+ 1
22723
+ 1
22724
+ 1
22725
+ 1
22726
+ 1
22727
+ 1
22728
+ 1
22729
+ 1
22730
+ 1
22731
+ 1
22732
+ 1
22733
+ 1
22734
+ 1
22735
+ 1
22736
+ 1
22737
+ 1
22738
+ 1
22739
+ 1
22740
+ 1
22741
+ 1
22742
+ 1
22743
+ 1
22744
+ 1
22745
+ 1
22746
+ 1
22747
+ 1
22748
+ 1
22749
+ 1
22750
+ 1
22751
+ 1
22752
+ 1
22753
+ 1
22754
+ 1
22755
+ 1
22756
+ 1
22757
+ 1
22758
+ 1
22759
+ 1
22760
+ 1
22761
+ 1
22762
+ 1
22763
+ 1
22764
+ 1
22765
+ 1
22766
+ 1
22767
+ 1
22768
+ 1
22769
+ 1
22770
+ 1
22771
+ 1
22772
+ 1
22773
+ 1
22774
+ 1
22775
+ 1
22776
+ 1
22777
+ 1
22778
+ 1
22779
+ 1
22780
+ 1
22781
+ 1
22782
+ 1
22783
+ 1
22784
+ 1
22785
+ 1
22786
+ 1
22787
+ 1
22788
+ 1
22789
+ 1
22790
+ 1
22791
+ 1
22792
+ 1
22793
+ 1
22794
+ 1
22795
+ 1
22796
+ 1
22797
+ 1
22798
+ 1
22799
+ 1
22800
+ 1
22801
+ 1
22802
+ 1
22803
+ 1
22804
+ 1
22805
+ 1
22806
+ 1
22807
+ 1
22808
+ 1
22809
+ 1
22810
+ 1
22811
+ 1
22812
+ 1
22813
+ 1
22814
+ 1
22815
+ 1
22816
+ 1
22817
+ 1
22818
+ 1
22819
+ 1
22820
+ 1
22821
+ 1
22822
+ 1
22823
+ 1
22824
+ 1
22825
+ 1
22826
+ 1
22827
+ 1
22828
+ 1
22829
+ 1
22830
+ 1
22831
+ 1
22832
+ 1
22833
+ 1
22834
+ 1
22835
+ 1
22836
+ 1
22837
+ 1
22838
+ 1
22839
+ 1
22840
+ 1
22841
+ 1
22842
+ 1
22843
+ 1
22844
+ 1
22845
+ 1
22846
+ 1
22847
+ 1
22848
+ 1
22849
+ 1
22850
+ 1
22851
+ 1
22852
+ 1
22853
+ 1
22854
+ 1
22855
+ 1
22856
+ 1
22857
+ 1
22858
+ 2
22859
+ 2
22860
+ 1
22861
+ 1
22862
+ 1
22863
+ 1
22864
+ 1
22865
+ 1
22866
+ 1
22867
+ 2
22868
+ 1
22869
+ 1
22870
+ 1
22871
+ 1
22872
+ 1
vtoonify/model/raft/core/__init__.py ADDED
File without changes
vtoonify/model/raft/core/corr.py ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn.functional as F
3
+ from model.raft.core.utils.utils import bilinear_sampler, coords_grid
4
+
5
+ try:
6
+ import alt_cuda_corr
7
+ except:
8
+ # alt_cuda_corr is not compiled
9
+ pass
10
+
11
+
12
+ class CorrBlock:
13
+ def __init__(self, fmap1, fmap2, num_levels=4, radius=4):
14
+ self.num_levels = num_levels
15
+ self.radius = radius
16
+ self.corr_pyramid = []
17
+
18
+ # all pairs correlation
19
+ corr = CorrBlock.corr(fmap1, fmap2)
20
+
21
+ batch, h1, w1, dim, h2, w2 = corr.shape
22
+ corr = corr.reshape(batch*h1*w1, dim, h2, w2)
23
+
24
+ self.corr_pyramid.append(corr)
25
+ for i in range(self.num_levels-1):
26
+ corr = F.avg_pool2d(corr, 2, stride=2)
27
+ self.corr_pyramid.append(corr)
28
+
29
+ def __call__(self, coords):
30
+ r = self.radius
31
+ coords = coords.permute(0, 2, 3, 1)
32
+ batch, h1, w1, _ = coords.shape
33
+
34
+ out_pyramid = []
35
+ for i in range(self.num_levels):
36
+ corr = self.corr_pyramid[i]
37
+ dx = torch.linspace(-r, r, 2*r+1, device=coords.device)
38
+ dy = torch.linspace(-r, r, 2*r+1, device=coords.device)
39
+ delta = torch.stack(torch.meshgrid(dy, dx), axis=-1)
40
+
41
+ centroid_lvl = coords.reshape(batch*h1*w1, 1, 1, 2) / 2**i
42
+ delta_lvl = delta.view(1, 2*r+1, 2*r+1, 2)
43
+ coords_lvl = centroid_lvl + delta_lvl
44
+
45
+ corr = bilinear_sampler(corr, coords_lvl)
46
+ corr = corr.view(batch, h1, w1, -1)
47
+ out_pyramid.append(corr)
48
+
49
+ out = torch.cat(out_pyramid, dim=-1)
50
+ return out.permute(0, 3, 1, 2).contiguous().float()
51
+
52
+ @staticmethod
53
+ def corr(fmap1, fmap2):
54
+ batch, dim, ht, wd = fmap1.shape
55
+ fmap1 = fmap1.view(batch, dim, ht*wd)
56
+ fmap2 = fmap2.view(batch, dim, ht*wd)
57
+
58
+ corr = torch.matmul(fmap1.transpose(1,2), fmap2)
59
+ corr = corr.view(batch, ht, wd, 1, ht, wd)
60
+ return corr / torch.sqrt(torch.tensor(dim).float())
61
+
62
+
63
+ class AlternateCorrBlock:
64
+ def __init__(self, fmap1, fmap2, num_levels=4, radius=4):
65
+ self.num_levels = num_levels
66
+ self.radius = radius
67
+
68
+ self.pyramid = [(fmap1, fmap2)]
69
+ for i in range(self.num_levels):
70
+ fmap1 = F.avg_pool2d(fmap1, 2, stride=2)
71
+ fmap2 = F.avg_pool2d(fmap2, 2, stride=2)
72
+ self.pyramid.append((fmap1, fmap2))
73
+
74
+ def __call__(self, coords):
75
+ coords = coords.permute(0, 2, 3, 1)
76
+ B, H, W, _ = coords.shape
77
+ dim = self.pyramid[0][0].shape[1]
78
+
79
+ corr_list = []
80
+ for i in range(self.num_levels):
81
+ r = self.radius
82
+ fmap1_i = self.pyramid[0][0].permute(0, 2, 3, 1).contiguous()
83
+ fmap2_i = self.pyramid[i][1].permute(0, 2, 3, 1).contiguous()
84
+
85
+ coords_i = (coords / 2**i).reshape(B, 1, H, W, 2).contiguous()
86
+ corr, = alt_cuda_corr.forward(fmap1_i, fmap2_i, coords_i, r)
87
+ corr_list.append(corr.squeeze(1))
88
+
89
+ corr = torch.stack(corr_list, dim=1)
90
+ corr = corr.reshape(B, -1, H, W)
91
+ return corr / torch.sqrt(torch.tensor(dim).float())
vtoonify/model/raft/core/datasets.py ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Data loading based on https://github.com/NVIDIA/flownet2-pytorch
2
+
3
+ import numpy as np
4
+ import torch
5
+ import torch.utils.data as data
6
+ import torch.nn.functional as F
7
+
8
+ import os
9
+ import math
10
+ import random
11
+ from glob import glob
12
+ import os.path as osp
13
+
14
+ from model.raft.core.utils import frame_utils
15
+ from model.raft.core.utils.augmentor import FlowAugmentor, SparseFlowAugmentor
16
+
17
+
18
+ class FlowDataset(data.Dataset):
19
+ def __init__(self, aug_params=None, sparse=False):
20
+ self.augmentor = None
21
+ self.sparse = sparse
22
+ if aug_params is not None:
23
+ if sparse:
24
+ self.augmentor = SparseFlowAugmentor(**aug_params)
25
+ else:
26
+ self.augmentor = FlowAugmentor(**aug_params)
27
+
28
+ self.is_test = False
29
+ self.init_seed = False
30
+ self.flow_list = []
31
+ self.image_list = []
32
+ self.extra_info = []
33
+
34
+ def __getitem__(self, index):
35
+
36
+ if self.is_test:
37
+ img1 = frame_utils.read_gen(self.image_list[index][0])
38
+ img2 = frame_utils.read_gen(self.image_list[index][1])
39
+ img1 = np.array(img1).astype(np.uint8)[..., :3]
40
+ img2 = np.array(img2).astype(np.uint8)[..., :3]
41
+ img1 = torch.from_numpy(img1).permute(2, 0, 1).float()
42
+ img2 = torch.from_numpy(img2).permute(2, 0, 1).float()
43
+ return img1, img2, self.extra_info[index]
44
+
45
+ if not self.init_seed:
46
+ worker_info = torch.utils.data.get_worker_info()
47
+ if worker_info is not None:
48
+ torch.manual_seed(worker_info.id)
49
+ np.random.seed(worker_info.id)
50
+ random.seed(worker_info.id)
51
+ self.init_seed = True
52
+
53
+ index = index % len(self.image_list)
54
+ valid = None
55
+ if self.sparse:
56
+ flow, valid = frame_utils.readFlowKITTI(self.flow_list[index])
57
+ else:
58
+ flow = frame_utils.read_gen(self.flow_list[index])
59
+
60
+ img1 = frame_utils.read_gen(self.image_list[index][0])
61
+ img2 = frame_utils.read_gen(self.image_list[index][1])
62
+
63
+ flow = np.array(flow).astype(np.float32)
64
+ img1 = np.array(img1).astype(np.uint8)
65
+ img2 = np.array(img2).astype(np.uint8)
66
+
67
+ # grayscale images
68
+ if len(img1.shape) == 2:
69
+ img1 = np.tile(img1[...,None], (1, 1, 3))
70
+ img2 = np.tile(img2[...,None], (1, 1, 3))
71
+ else:
72
+ img1 = img1[..., :3]
73
+ img2 = img2[..., :3]
74
+
75
+ if self.augmentor is not None:
76
+ if self.sparse:
77
+ img1, img2, flow, valid = self.augmentor(img1, img2, flow, valid)
78
+ else:
79
+ img1, img2, flow = self.augmentor(img1, img2, flow)
80
+
81
+ img1 = torch.from_numpy(img1).permute(2, 0, 1).float()
82
+ img2 = torch.from_numpy(img2).permute(2, 0, 1).float()
83
+ flow = torch.from_numpy(flow).permute(2, 0, 1).float()
84
+
85
+ if valid is not None:
86
+ valid = torch.from_numpy(valid)
87
+ else:
88
+ valid = (flow[0].abs() < 1000) & (flow[1].abs() < 1000)
89
+
90
+ return img1, img2, flow, valid.float()
91
+
92
+
93
+ def __rmul__(self, v):
94
+ self.flow_list = v * self.flow_list
95
+ self.image_list = v * self.image_list
96
+ return self
97
+
98
+ def __len__(self):
99
+ return len(self.image_list)
100
+
101
+
102
+ class MpiSintel(FlowDataset):
103
+ def __init__(self, aug_params=None, split='training', root='datasets/Sintel', dstype='clean'):
104
+ super(MpiSintel, self).__init__(aug_params)
105
+ flow_root = osp.join(root, split, 'flow')
106
+ image_root = osp.join(root, split, dstype)
107
+
108
+ if split == 'test':
109
+ self.is_test = True
110
+
111
+ for scene in os.listdir(image_root):
112
+ image_list = sorted(glob(osp.join(image_root, scene, '*.png')))
113
+ for i in range(len(image_list)-1):
114
+ self.image_list += [ [image_list[i], image_list[i+1]] ]
115
+ self.extra_info += [ (scene, i) ] # scene and frame_id
116
+
117
+ if split != 'test':
118
+ self.flow_list += sorted(glob(osp.join(flow_root, scene, '*.flo')))
119
+
120
+
121
+ class FlyingChairs(FlowDataset):
122
+ def __init__(self, aug_params=None, split='train', root='datasets/FlyingChairs_release/data'):
123
+ super(FlyingChairs, self).__init__(aug_params)
124
+
125
+ images = sorted(glob(osp.join(root, '*.ppm')))
126
+ flows = sorted(glob(osp.join(root, '*.flo')))
127
+ assert (len(images)//2 == len(flows))
128
+
129
+ split_list = np.loadtxt('chairs_split.txt', dtype=np.int32)
130
+ for i in range(len(flows)):
131
+ xid = split_list[i]
132
+ if (split=='training' and xid==1) or (split=='validation' and xid==2):
133
+ self.flow_list += [ flows[i] ]
134
+ self.image_list += [ [images[2*i], images[2*i+1]] ]
135
+
136
+
137
+ class FlyingThings3D(FlowDataset):
138
+ def __init__(self, aug_params=None, root='datasets/FlyingThings3D', dstype='frames_cleanpass'):
139
+ super(FlyingThings3D, self).__init__(aug_params)
140
+
141
+ for cam in ['left']:
142
+ for direction in ['into_future', 'into_past']:
143
+ image_dirs = sorted(glob(osp.join(root, dstype, 'TRAIN/*/*')))
144
+ image_dirs = sorted([osp.join(f, cam) for f in image_dirs])
145
+
146
+ flow_dirs = sorted(glob(osp.join(root, 'optical_flow/TRAIN/*/*')))
147
+ flow_dirs = sorted([osp.join(f, direction, cam) for f in flow_dirs])
148
+
149
+ for idir, fdir in zip(image_dirs, flow_dirs):
150
+ images = sorted(glob(osp.join(idir, '*.png')) )
151
+ flows = sorted(glob(osp.join(fdir, '*.pfm')) )
152
+ for i in range(len(flows)-1):
153
+ if direction == 'into_future':
154
+ self.image_list += [ [images[i], images[i+1]] ]
155
+ self.flow_list += [ flows[i] ]
156
+ elif direction == 'into_past':
157
+ self.image_list += [ [images[i+1], images[i]] ]
158
+ self.flow_list += [ flows[i+1] ]
159
+
160
+
161
+ class KITTI(FlowDataset):
162
+ def __init__(self, aug_params=None, split='training', root='datasets/KITTI'):
163
+ super(KITTI, self).__init__(aug_params, sparse=True)
164
+ if split == 'testing':
165
+ self.is_test = True
166
+
167
+ root = osp.join(root, split)
168
+ images1 = sorted(glob(osp.join(root, 'image_2/*_10.png')))
169
+ images2 = sorted(glob(osp.join(root, 'image_2/*_11.png')))
170
+
171
+ for img1, img2 in zip(images1, images2):
172
+ frame_id = img1.split('/')[-1]
173
+ self.extra_info += [ [frame_id] ]
174
+ self.image_list += [ [img1, img2] ]
175
+
176
+ if split == 'training':
177
+ self.flow_list = sorted(glob(osp.join(root, 'flow_occ/*_10.png')))
178
+
179
+
180
+ class HD1K(FlowDataset):
181
+ def __init__(self, aug_params=None, root='datasets/HD1k'):
182
+ super(HD1K, self).__init__(aug_params, sparse=True)
183
+
184
+ seq_ix = 0
185
+ while 1:
186
+ flows = sorted(glob(os.path.join(root, 'hd1k_flow_gt', 'flow_occ/%06d_*.png' % seq_ix)))
187
+ images = sorted(glob(os.path.join(root, 'hd1k_input', 'image_2/%06d_*.png' % seq_ix)))
188
+
189
+ if len(flows) == 0:
190
+ break
191
+
192
+ for i in range(len(flows)-1):
193
+ self.flow_list += [flows[i]]
194
+ self.image_list += [ [images[i], images[i+1]] ]
195
+
196
+ seq_ix += 1
197
+
198
+
199
+ def fetch_dataloader(args, TRAIN_DS='C+T+K+S+H'):
200
+ """ Create the data loader for the corresponding trainign set """
201
+
202
+ if args.stage == 'chairs':
203
+ aug_params = {'crop_size': args.image_size, 'min_scale': -0.1, 'max_scale': 1.0, 'do_flip': True}
204
+ train_dataset = FlyingChairs(aug_params, split='training')
205
+
206
+ elif args.stage == 'things':
207
+ aug_params = {'crop_size': args.image_size, 'min_scale': -0.4, 'max_scale': 0.8, 'do_flip': True}
208
+ clean_dataset = FlyingThings3D(aug_params, dstype='frames_cleanpass')
209
+ final_dataset = FlyingThings3D(aug_params, dstype='frames_finalpass')
210
+ train_dataset = clean_dataset + final_dataset
211
+
212
+ elif args.stage == 'sintel':
213
+ aug_params = {'crop_size': args.image_size, 'min_scale': -0.2, 'max_scale': 0.6, 'do_flip': True}
214
+ things = FlyingThings3D(aug_params, dstype='frames_cleanpass')
215
+ sintel_clean = MpiSintel(aug_params, split='training', dstype='clean')
216
+ sintel_final = MpiSintel(aug_params, split='training', dstype='final')
217
+
218
+ if TRAIN_DS == 'C+T+K+S+H':
219
+ kitti = KITTI({'crop_size': args.image_size, 'min_scale': -0.3, 'max_scale': 0.5, 'do_flip': True})
220
+ hd1k = HD1K({'crop_size': args.image_size, 'min_scale': -0.5, 'max_scale': 0.2, 'do_flip': True})
221
+ train_dataset = 100*sintel_clean + 100*sintel_final + 200*kitti + 5*hd1k + things
222
+
223
+ elif TRAIN_DS == 'C+T+K/S':
224
+ train_dataset = 100*sintel_clean + 100*sintel_final + things
225
+
226
+ elif args.stage == 'kitti':
227
+ aug_params = {'crop_size': args.image_size, 'min_scale': -0.2, 'max_scale': 0.4, 'do_flip': False}
228
+ train_dataset = KITTI(aug_params, split='training')
229
+
230
+ train_loader = data.DataLoader(train_dataset, batch_size=args.batch_size,
231
+ pin_memory=False, shuffle=True, num_workers=4, drop_last=True)
232
+
233
+ print('Training with %d image pairs' % len(train_dataset))
234
+ return train_loader
235
+
vtoonify/model/raft/core/extractor.py ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.nn.functional as F
4
+
5
+
6
+ class ResidualBlock(nn.Module):
7
+ def __init__(self, in_planes, planes, norm_fn='group', stride=1):
8
+ super(ResidualBlock, self).__init__()
9
+
10
+ self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, padding=1, stride=stride)
11
+ self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, padding=1)
12
+ self.relu = nn.ReLU(inplace=True)
13
+
14
+ num_groups = planes // 8
15
+
16
+ if norm_fn == 'group':
17
+ self.norm1 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
18
+ self.norm2 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
19
+ if not stride == 1:
20
+ self.norm3 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
21
+
22
+ elif norm_fn == 'batch':
23
+ self.norm1 = nn.BatchNorm2d(planes)
24
+ self.norm2 = nn.BatchNorm2d(planes)
25
+ if not stride == 1:
26
+ self.norm3 = nn.BatchNorm2d(planes)
27
+
28
+ elif norm_fn == 'instance':
29
+ self.norm1 = nn.InstanceNorm2d(planes)
30
+ self.norm2 = nn.InstanceNorm2d(planes)
31
+ if not stride == 1:
32
+ self.norm3 = nn.InstanceNorm2d(planes)
33
+
34
+ elif norm_fn == 'none':
35
+ self.norm1 = nn.Sequential()
36
+ self.norm2 = nn.Sequential()
37
+ if not stride == 1:
38
+ self.norm3 = nn.Sequential()
39
+
40
+ if stride == 1:
41
+ self.downsample = None
42
+
43
+ else:
44
+ self.downsample = nn.Sequential(
45
+ nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride), self.norm3)
46
+
47
+
48
+ def forward(self, x):
49
+ y = x
50
+ y = self.relu(self.norm1(self.conv1(y)))
51
+ y = self.relu(self.norm2(self.conv2(y)))
52
+
53
+ if self.downsample is not None:
54
+ x = self.downsample(x)
55
+
56
+ return self.relu(x+y)
57
+
58
+
59
+
60
+ class BottleneckBlock(nn.Module):
61
+ def __init__(self, in_planes, planes, norm_fn='group', stride=1):
62
+ super(BottleneckBlock, self).__init__()
63
+
64
+ self.conv1 = nn.Conv2d(in_planes, planes//4, kernel_size=1, padding=0)
65
+ self.conv2 = nn.Conv2d(planes//4, planes//4, kernel_size=3, padding=1, stride=stride)
66
+ self.conv3 = nn.Conv2d(planes//4, planes, kernel_size=1, padding=0)
67
+ self.relu = nn.ReLU(inplace=True)
68
+
69
+ num_groups = planes // 8
70
+
71
+ if norm_fn == 'group':
72
+ self.norm1 = nn.GroupNorm(num_groups=num_groups, num_channels=planes//4)
73
+ self.norm2 = nn.GroupNorm(num_groups=num_groups, num_channels=planes//4)
74
+ self.norm3 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
75
+ if not stride == 1:
76
+ self.norm4 = nn.GroupNorm(num_groups=num_groups, num_channels=planes)
77
+
78
+ elif norm_fn == 'batch':
79
+ self.norm1 = nn.BatchNorm2d(planes//4)
80
+ self.norm2 = nn.BatchNorm2d(planes//4)
81
+ self.norm3 = nn.BatchNorm2d(planes)
82
+ if not stride == 1:
83
+ self.norm4 = nn.BatchNorm2d(planes)
84
+
85
+ elif norm_fn == 'instance':
86
+ self.norm1 = nn.InstanceNorm2d(planes//4)
87
+ self.norm2 = nn.InstanceNorm2d(planes//4)
88
+ self.norm3 = nn.InstanceNorm2d(planes)
89
+ if not stride == 1:
90
+ self.norm4 = nn.InstanceNorm2d(planes)
91
+
92
+ elif norm_fn == 'none':
93
+ self.norm1 = nn.Sequential()
94
+ self.norm2 = nn.Sequential()
95
+ self.norm3 = nn.Sequential()
96
+ if not stride == 1:
97
+ self.norm4 = nn.Sequential()
98
+
99
+ if stride == 1:
100
+ self.downsample = None
101
+
102
+ else:
103
+ self.downsample = nn.Sequential(
104
+ nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride), self.norm4)
105
+
106
+
107
+ def forward(self, x):
108
+ y = x
109
+ y = self.relu(self.norm1(self.conv1(y)))
110
+ y = self.relu(self.norm2(self.conv2(y)))
111
+ y = self.relu(self.norm3(self.conv3(y)))
112
+
113
+ if self.downsample is not None:
114
+ x = self.downsample(x)
115
+
116
+ return self.relu(x+y)
117
+
118
+ class BasicEncoder(nn.Module):
119
+ def __init__(self, output_dim=128, norm_fn='batch', dropout=0.0):
120
+ super(BasicEncoder, self).__init__()
121
+ self.norm_fn = norm_fn
122
+
123
+ if self.norm_fn == 'group':
124
+ self.norm1 = nn.GroupNorm(num_groups=8, num_channels=64)
125
+
126
+ elif self.norm_fn == 'batch':
127
+ self.norm1 = nn.BatchNorm2d(64)
128
+
129
+ elif self.norm_fn == 'instance':
130
+ self.norm1 = nn.InstanceNorm2d(64)
131
+
132
+ elif self.norm_fn == 'none':
133
+ self.norm1 = nn.Sequential()
134
+
135
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)
136
+ self.relu1 = nn.ReLU(inplace=True)
137
+
138
+ self.in_planes = 64
139
+ self.layer1 = self._make_layer(64, stride=1)
140
+ self.layer2 = self._make_layer(96, stride=2)
141
+ self.layer3 = self._make_layer(128, stride=2)
142
+
143
+ # output convolution
144
+ self.conv2 = nn.Conv2d(128, output_dim, kernel_size=1)
145
+
146
+ self.dropout = None
147
+ if dropout > 0:
148
+ self.dropout = nn.Dropout2d(p=dropout)
149
+
150
+ for m in self.modules():
151
+ if isinstance(m, nn.Conv2d):
152
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
153
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
154
+ if m.weight is not None:
155
+ nn.init.constant_(m.weight, 1)
156
+ if m.bias is not None:
157
+ nn.init.constant_(m.bias, 0)
158
+
159
+ def _make_layer(self, dim, stride=1):
160
+ layer1 = ResidualBlock(self.in_planes, dim, self.norm_fn, stride=stride)
161
+ layer2 = ResidualBlock(dim, dim, self.norm_fn, stride=1)
162
+ layers = (layer1, layer2)
163
+
164
+ self.in_planes = dim
165
+ return nn.Sequential(*layers)
166
+
167
+
168
+ def forward(self, x):
169
+
170
+ # if input is list, combine batch dimension
171
+ is_list = isinstance(x, tuple) or isinstance(x, list)
172
+ if is_list:
173
+ batch_dim = x[0].shape[0]
174
+ x = torch.cat(x, dim=0)
175
+
176
+ x = self.conv1(x)
177
+ x = self.norm1(x)
178
+ x = self.relu1(x)
179
+
180
+ x = self.layer1(x)
181
+ x = self.layer2(x)
182
+ x = self.layer3(x)
183
+
184
+ x = self.conv2(x)
185
+
186
+ if self.training and self.dropout is not None:
187
+ x = self.dropout(x)
188
+
189
+ if is_list:
190
+ x = torch.split(x, [batch_dim, batch_dim], dim=0)
191
+
192
+ return x
193
+
194
+
195
+ class SmallEncoder(nn.Module):
196
+ def __init__(self, output_dim=128, norm_fn='batch', dropout=0.0):
197
+ super(SmallEncoder, self).__init__()
198
+ self.norm_fn = norm_fn
199
+
200
+ if self.norm_fn == 'group':
201
+ self.norm1 = nn.GroupNorm(num_groups=8, num_channels=32)
202
+
203
+ elif self.norm_fn == 'batch':
204
+ self.norm1 = nn.BatchNorm2d(32)
205
+
206
+ elif self.norm_fn == 'instance':
207
+ self.norm1 = nn.InstanceNorm2d(32)
208
+
209
+ elif self.norm_fn == 'none':
210
+ self.norm1 = nn.Sequential()
211
+
212
+ self.conv1 = nn.Conv2d(3, 32, kernel_size=7, stride=2, padding=3)
213
+ self.relu1 = nn.ReLU(inplace=True)
214
+
215
+ self.in_planes = 32
216
+ self.layer1 = self._make_layer(32, stride=1)
217
+ self.layer2 = self._make_layer(64, stride=2)
218
+ self.layer3 = self._make_layer(96, stride=2)
219
+
220
+ self.dropout = None
221
+ if dropout > 0:
222
+ self.dropout = nn.Dropout2d(p=dropout)
223
+
224
+ self.conv2 = nn.Conv2d(96, output_dim, kernel_size=1)
225
+
226
+ for m in self.modules():
227
+ if isinstance(m, nn.Conv2d):
228
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
229
+ elif isinstance(m, (nn.BatchNorm2d, nn.InstanceNorm2d, nn.GroupNorm)):
230
+ if m.weight is not None:
231
+ nn.init.constant_(m.weight, 1)
232
+ if m.bias is not None:
233
+ nn.init.constant_(m.bias, 0)
234
+
235
+ def _make_layer(self, dim, stride=1):
236
+ layer1 = BottleneckBlock(self.in_planes, dim, self.norm_fn, stride=stride)
237
+ layer2 = BottleneckBlock(dim, dim, self.norm_fn, stride=1)
238
+ layers = (layer1, layer2)
239
+
240
+ self.in_planes = dim
241
+ return nn.Sequential(*layers)
242
+
243
+
244
+ def forward(self, x):
245
+
246
+ # if input is list, combine batch dimension
247
+ is_list = isinstance(x, tuple) or isinstance(x, list)
248
+ if is_list:
249
+ batch_dim = x[0].shape[0]
250
+ x = torch.cat(x, dim=0)
251
+
252
+ x = self.conv1(x)
253
+ x = self.norm1(x)
254
+ x = self.relu1(x)
255
+
256
+ x = self.layer1(x)
257
+ x = self.layer2(x)
258
+ x = self.layer3(x)
259
+ x = self.conv2(x)
260
+
261
+ if self.training and self.dropout is not None:
262
+ x = self.dropout(x)
263
+
264
+ if is_list:
265
+ x = torch.split(x, [batch_dim, batch_dim], dim=0)
266
+
267
+ return x
vtoonify/model/raft/core/raft.py ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import torch
3
+ import torch.nn as nn
4
+ import torch.nn.functional as F
5
+
6
+ from model.raft.core.update import BasicUpdateBlock, SmallUpdateBlock
7
+ from model.raft.core.extractor import BasicEncoder, SmallEncoder
8
+ from model.raft.core.corr import CorrBlock, AlternateCorrBlock
9
+ from model.raft.core.utils.utils import bilinear_sampler, coords_grid, upflow8
10
+
11
+ try:
12
+ autocast = torch.cuda.amp.autocast
13
+ except:
14
+ # dummy autocast for PyTorch < 1.6
15
+ class autocast:
16
+ def __init__(self, enabled):
17
+ pass
18
+ def __enter__(self):
19
+ pass
20
+ def __exit__(self, *args):
21
+ pass
22
+
23
+
24
+ class RAFT(nn.Module):
25
+ def __init__(self, args):
26
+ super(RAFT, self).__init__()
27
+ self.args = args
28
+
29
+ if args.small:
30
+ self.hidden_dim = hdim = 96
31
+ self.context_dim = cdim = 64
32
+ args.corr_levels = 4
33
+ args.corr_radius = 3
34
+
35
+ else:
36
+ self.hidden_dim = hdim = 128
37
+ self.context_dim = cdim = 128
38
+ args.corr_levels = 4
39
+ args.corr_radius = 4
40
+
41
+ if 'dropout' not in self.args:
42
+ self.args.dropout = 0
43
+
44
+ if 'alternate_corr' not in self.args:
45
+ self.args.alternate_corr = False
46
+
47
+ # feature network, context network, and update block
48
+ if args.small:
49
+ self.fnet = SmallEncoder(output_dim=128, norm_fn='instance', dropout=args.dropout)
50
+ self.cnet = SmallEncoder(output_dim=hdim+cdim, norm_fn='none', dropout=args.dropout)
51
+ self.update_block = SmallUpdateBlock(self.args, hidden_dim=hdim)
52
+
53
+ else:
54
+ self.fnet = BasicEncoder(output_dim=256, norm_fn='instance', dropout=args.dropout)
55
+ self.cnet = BasicEncoder(output_dim=hdim+cdim, norm_fn='batch', dropout=args.dropout)
56
+ self.update_block = BasicUpdateBlock(self.args, hidden_dim=hdim)
57
+
58
+ def freeze_bn(self):
59
+ for m in self.modules():
60
+ if isinstance(m, nn.BatchNorm2d):
61
+ m.eval()
62
+
63
+ def initialize_flow(self, img):
64
+ """ Flow is represented as difference between two coordinate grids flow = coords1 - coords0"""
65
+ N, C, H, W = img.shape
66
+ coords0 = coords_grid(N, H//8, W//8, device=img.device)
67
+ coords1 = coords_grid(N, H//8, W//8, device=img.device)
68
+
69
+ # optical flow computed as difference: flow = coords1 - coords0
70
+ return coords0, coords1
71
+
72
+ def upsample_flow(self, flow, mask):
73
+ """ Upsample flow field [H/8, W/8, 2] -> [H, W, 2] using convex combination """
74
+ N, _, H, W = flow.shape
75
+ mask = mask.view(N, 1, 9, 8, 8, H, W)
76
+ mask = torch.softmax(mask, dim=2)
77
+
78
+ up_flow = F.unfold(8 * flow, [3,3], padding=1)
79
+ up_flow = up_flow.view(N, 2, 9, 1, 1, H, W)
80
+
81
+ up_flow = torch.sum(mask * up_flow, dim=2)
82
+ up_flow = up_flow.permute(0, 1, 4, 2, 5, 3)
83
+ return up_flow.reshape(N, 2, 8*H, 8*W)
84
+
85
+
86
+ def forward(self, image1, image2, iters=12, flow_init=None, upsample=True, test_mode=False):
87
+ """ Estimate optical flow between pair of frames """
88
+
89
+ image1 = 2 * (image1 / 255.0) - 1.0
90
+ image2 = 2 * (image2 / 255.0) - 1.0
91
+
92
+ image1 = image1.contiguous()
93
+ image2 = image2.contiguous()
94
+
95
+ hdim = self.hidden_dim
96
+ cdim = self.context_dim
97
+
98
+ # run the feature network
99
+ with autocast(enabled=self.args.mixed_precision):
100
+ fmap1, fmap2 = self.fnet([image1, image2])
101
+
102
+ fmap1 = fmap1.float()
103
+ fmap2 = fmap2.float()
104
+ if self.args.alternate_corr:
105
+ corr_fn = AlternateCorrBlock(fmap1, fmap2, radius=self.args.corr_radius)
106
+ else:
107
+ corr_fn = CorrBlock(fmap1, fmap2, radius=self.args.corr_radius)
108
+
109
+ # run the context network
110
+ with autocast(enabled=self.args.mixed_precision):
111
+ cnet = self.cnet(image1)
112
+ net, inp = torch.split(cnet, [hdim, cdim], dim=1)
113
+ net = torch.tanh(net)
114
+ inp = torch.relu(inp)
115
+
116
+ coords0, coords1 = self.initialize_flow(image1)
117
+
118
+ if flow_init is not None:
119
+ coords1 = coords1 + flow_init
120
+
121
+ flow_predictions = []
122
+ for itr in range(iters):
123
+ coords1 = coords1.detach()
124
+ corr = corr_fn(coords1) # index correlation volume
125
+
126
+ flow = coords1 - coords0
127
+ with autocast(enabled=self.args.mixed_precision):
128
+ net, up_mask, delta_flow = self.update_block(net, inp, corr, flow)
129
+
130
+ # F(t+1) = F(t) + \Delta(t)
131
+ coords1 = coords1 + delta_flow
132
+
133
+ # upsample predictions
134
+ if up_mask is None:
135
+ flow_up = upflow8(coords1 - coords0)
136
+ else:
137
+ flow_up = self.upsample_flow(coords1 - coords0, up_mask)
138
+
139
+ flow_predictions.append(flow_up)
140
+
141
+ if test_mode:
142
+ return coords1 - coords0, flow_up
143
+
144
+ return flow_predictions
vtoonify/model/raft/core/update.py ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.nn.functional as F
4
+
5
+
6
+ class FlowHead(nn.Module):
7
+ def __init__(self, input_dim=128, hidden_dim=256):
8
+ super(FlowHead, self).__init__()
9
+ self.conv1 = nn.Conv2d(input_dim, hidden_dim, 3, padding=1)
10
+ self.conv2 = nn.Conv2d(hidden_dim, 2, 3, padding=1)
11
+ self.relu = nn.ReLU(inplace=True)
12
+
13
+ def forward(self, x):
14
+ return self.conv2(self.relu(self.conv1(x)))
15
+
16
+ class ConvGRU(nn.Module):
17
+ def __init__(self, hidden_dim=128, input_dim=192+128):
18
+ super(ConvGRU, self).__init__()
19
+ self.convz = nn.Conv2d(hidden_dim+input_dim, hidden_dim, 3, padding=1)
20
+ self.convr = nn.Conv2d(hidden_dim+input_dim, hidden_dim, 3, padding=1)
21
+ self.convq = nn.Conv2d(hidden_dim+input_dim, hidden_dim, 3, padding=1)
22
+
23
+ def forward(self, h, x):
24
+ hx = torch.cat([h, x], dim=1)
25
+
26
+ z = torch.sigmoid(self.convz(hx))
27
+ r = torch.sigmoid(self.convr(hx))
28
+ q = torch.tanh(self.convq(torch.cat([r*h, x], dim=1)))
29
+
30
+ h = (1-z) * h + z * q
31
+ return h
32
+
33
+ class SepConvGRU(nn.Module):
34
+ def __init__(self, hidden_dim=128, input_dim=192+128):
35
+ super(SepConvGRU, self).__init__()
36
+ self.convz1 = nn.Conv2d(hidden_dim+input_dim, hidden_dim, (1,5), padding=(0,2))
37
+ self.convr1 = nn.Conv2d(hidden_dim+input_dim, hidden_dim, (1,5), padding=(0,2))
38
+ self.convq1 = nn.Conv2d(hidden_dim+input_dim, hidden_dim, (1,5), padding=(0,2))
39
+
40
+ self.convz2 = nn.Conv2d(hidden_dim+input_dim, hidden_dim, (5,1), padding=(2,0))
41
+ self.convr2 = nn.Conv2d(hidden_dim+input_dim, hidden_dim, (5,1), padding=(2,0))
42
+ self.convq2 = nn.Conv2d(hidden_dim+input_dim, hidden_dim, (5,1), padding=(2,0))
43
+
44
+
45
+ def forward(self, h, x):
46
+ # horizontal
47
+ hx = torch.cat([h, x], dim=1)
48
+ z = torch.sigmoid(self.convz1(hx))
49
+ r = torch.sigmoid(self.convr1(hx))
50
+ q = torch.tanh(self.convq1(torch.cat([r*h, x], dim=1)))
51
+ h = (1-z) * h + z * q
52
+
53
+ # vertical
54
+ hx = torch.cat([h, x], dim=1)
55
+ z = torch.sigmoid(self.convz2(hx))
56
+ r = torch.sigmoid(self.convr2(hx))
57
+ q = torch.tanh(self.convq2(torch.cat([r*h, x], dim=1)))
58
+ h = (1-z) * h + z * q
59
+
60
+ return h
61
+
62
+ class SmallMotionEncoder(nn.Module):
63
+ def __init__(self, args):
64
+ super(SmallMotionEncoder, self).__init__()
65
+ cor_planes = args.corr_levels * (2*args.corr_radius + 1)**2
66
+ self.convc1 = nn.Conv2d(cor_planes, 96, 1, padding=0)
67
+ self.convf1 = nn.Conv2d(2, 64, 7, padding=3)
68
+ self.convf2 = nn.Conv2d(64, 32, 3, padding=1)
69
+ self.conv = nn.Conv2d(128, 80, 3, padding=1)
70
+
71
+ def forward(self, flow, corr):
72
+ cor = F.relu(self.convc1(corr))
73
+ flo = F.relu(self.convf1(flow))
74
+ flo = F.relu(self.convf2(flo))
75
+ cor_flo = torch.cat([cor, flo], dim=1)
76
+ out = F.relu(self.conv(cor_flo))
77
+ return torch.cat([out, flow], dim=1)
78
+
79
+ class BasicMotionEncoder(nn.Module):
80
+ def __init__(self, args):
81
+ super(BasicMotionEncoder, self).__init__()
82
+ cor_planes = args.corr_levels * (2*args.corr_radius + 1)**2
83
+ self.convc1 = nn.Conv2d(cor_planes, 256, 1, padding=0)
84
+ self.convc2 = nn.Conv2d(256, 192, 3, padding=1)
85
+ self.convf1 = nn.Conv2d(2, 128, 7, padding=3)
86
+ self.convf2 = nn.Conv2d(128, 64, 3, padding=1)
87
+ self.conv = nn.Conv2d(64+192, 128-2, 3, padding=1)
88
+
89
+ def forward(self, flow, corr):
90
+ cor = F.relu(self.convc1(corr))
91
+ cor = F.relu(self.convc2(cor))
92
+ flo = F.relu(self.convf1(flow))
93
+ flo = F.relu(self.convf2(flo))
94
+
95
+ cor_flo = torch.cat([cor, flo], dim=1)
96
+ out = F.relu(self.conv(cor_flo))
97
+ return torch.cat([out, flow], dim=1)
98
+
99
+ class SmallUpdateBlock(nn.Module):
100
+ def __init__(self, args, hidden_dim=96):
101
+ super(SmallUpdateBlock, self).__init__()
102
+ self.encoder = SmallMotionEncoder(args)
103
+ self.gru = ConvGRU(hidden_dim=hidden_dim, input_dim=82+64)
104
+ self.flow_head = FlowHead(hidden_dim, hidden_dim=128)
105
+
106
+ def forward(self, net, inp, corr, flow):
107
+ motion_features = self.encoder(flow, corr)
108
+ inp = torch.cat([inp, motion_features], dim=1)
109
+ net = self.gru(net, inp)
110
+ delta_flow = self.flow_head(net)
111
+
112
+ return net, None, delta_flow
113
+
114
+ class BasicUpdateBlock(nn.Module):
115
+ def __init__(self, args, hidden_dim=128, input_dim=128):
116
+ super(BasicUpdateBlock, self).__init__()
117
+ self.args = args
118
+ self.encoder = BasicMotionEncoder(args)
119
+ self.gru = SepConvGRU(hidden_dim=hidden_dim, input_dim=128+hidden_dim)
120
+ self.flow_head = FlowHead(hidden_dim, hidden_dim=256)
121
+
122
+ self.mask = nn.Sequential(
123
+ nn.Conv2d(128, 256, 3, padding=1),
124
+ nn.ReLU(inplace=True),
125
+ nn.Conv2d(256, 64*9, 1, padding=0))
126
+
127
+ def forward(self, net, inp, corr, flow, upsample=True):
128
+ motion_features = self.encoder(flow, corr)
129
+ inp = torch.cat([inp, motion_features], dim=1)
130
+
131
+ net = self.gru(net, inp)
132
+ delta_flow = self.flow_head(net)
133
+
134
+ # scale mask to balence gradients
135
+ mask = .25 * self.mask(net)
136
+ return net, mask, delta_flow
137
+
138
+
139
+
vtoonify/model/raft/core/utils/__init__.py ADDED
File without changes
vtoonify/model/raft/core/utils/augmentor.py ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import random
3
+ import math
4
+ from PIL import Image
5
+
6
+ import cv2
7
+ cv2.setNumThreads(0)
8
+ cv2.ocl.setUseOpenCL(False)
9
+
10
+ import torch
11
+ from torchvision.transforms import ColorJitter
12
+ import torch.nn.functional as F
13
+
14
+
15
+ class FlowAugmentor:
16
+ def __init__(self, crop_size, min_scale=-0.2, max_scale=0.5, do_flip=True):
17
+
18
+ # spatial augmentation params
19
+ self.crop_size = crop_size
20
+ self.min_scale = min_scale
21
+ self.max_scale = max_scale
22
+ self.spatial_aug_prob = 0.8
23
+ self.stretch_prob = 0.8
24
+ self.max_stretch = 0.2
25
+
26
+ # flip augmentation params
27
+ self.do_flip = do_flip
28
+ self.h_flip_prob = 0.5
29
+ self.v_flip_prob = 0.1
30
+
31
+ # photometric augmentation params
32
+ self.photo_aug = ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4, hue=0.5/3.14)
33
+ self.asymmetric_color_aug_prob = 0.2
34
+ self.eraser_aug_prob = 0.5
35
+
36
+ def color_transform(self, img1, img2):
37
+ """ Photometric augmentation """
38
+
39
+ # asymmetric
40
+ if np.random.rand() < self.asymmetric_color_aug_prob:
41
+ img1 = np.array(self.photo_aug(Image.fromarray(img1)), dtype=np.uint8)
42
+ img2 = np.array(self.photo_aug(Image.fromarray(img2)), dtype=np.uint8)
43
+
44
+ # symmetric
45
+ else:
46
+ image_stack = np.concatenate([img1, img2], axis=0)
47
+ image_stack = np.array(self.photo_aug(Image.fromarray(image_stack)), dtype=np.uint8)
48
+ img1, img2 = np.split(image_stack, 2, axis=0)
49
+
50
+ return img1, img2
51
+
52
+ def eraser_transform(self, img1, img2, bounds=[50, 100]):
53
+ """ Occlusion augmentation """
54
+
55
+ ht, wd = img1.shape[:2]
56
+ if np.random.rand() < self.eraser_aug_prob:
57
+ mean_color = np.mean(img2.reshape(-1, 3), axis=0)
58
+ for _ in range(np.random.randint(1, 3)):
59
+ x0 = np.random.randint(0, wd)
60
+ y0 = np.random.randint(0, ht)
61
+ dx = np.random.randint(bounds[0], bounds[1])
62
+ dy = np.random.randint(bounds[0], bounds[1])
63
+ img2[y0:y0+dy, x0:x0+dx, :] = mean_color
64
+
65
+ return img1, img2
66
+
67
+ def spatial_transform(self, img1, img2, flow):
68
+ # randomly sample scale
69
+ ht, wd = img1.shape[:2]
70
+ min_scale = np.maximum(
71
+ (self.crop_size[0] + 8) / float(ht),
72
+ (self.crop_size[1] + 8) / float(wd))
73
+
74
+ scale = 2 ** np.random.uniform(self.min_scale, self.max_scale)
75
+ scale_x = scale
76
+ scale_y = scale
77
+ if np.random.rand() < self.stretch_prob:
78
+ scale_x *= 2 ** np.random.uniform(-self.max_stretch, self.max_stretch)
79
+ scale_y *= 2 ** np.random.uniform(-self.max_stretch, self.max_stretch)
80
+
81
+ scale_x = np.clip(scale_x, min_scale, None)
82
+ scale_y = np.clip(scale_y, min_scale, None)
83
+
84
+ if np.random.rand() < self.spatial_aug_prob:
85
+ # rescale the images
86
+ img1 = cv2.resize(img1, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR)
87
+ img2 = cv2.resize(img2, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR)
88
+ flow = cv2.resize(flow, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR)
89
+ flow = flow * [scale_x, scale_y]
90
+
91
+ if self.do_flip:
92
+ if np.random.rand() < self.h_flip_prob: # h-flip
93
+ img1 = img1[:, ::-1]
94
+ img2 = img2[:, ::-1]
95
+ flow = flow[:, ::-1] * [-1.0, 1.0]
96
+
97
+ if np.random.rand() < self.v_flip_prob: # v-flip
98
+ img1 = img1[::-1, :]
99
+ img2 = img2[::-1, :]
100
+ flow = flow[::-1, :] * [1.0, -1.0]
101
+
102
+ y0 = np.random.randint(0, img1.shape[0] - self.crop_size[0])
103
+ x0 = np.random.randint(0, img1.shape[1] - self.crop_size[1])
104
+
105
+ img1 = img1[y0:y0+self.crop_size[0], x0:x0+self.crop_size[1]]
106
+ img2 = img2[y0:y0+self.crop_size[0], x0:x0+self.crop_size[1]]
107
+ flow = flow[y0:y0+self.crop_size[0], x0:x0+self.crop_size[1]]
108
+
109
+ return img1, img2, flow
110
+
111
+ def __call__(self, img1, img2, flow):
112
+ img1, img2 = self.color_transform(img1, img2)
113
+ img1, img2 = self.eraser_transform(img1, img2)
114
+ img1, img2, flow = self.spatial_transform(img1, img2, flow)
115
+
116
+ img1 = np.ascontiguousarray(img1)
117
+ img2 = np.ascontiguousarray(img2)
118
+ flow = np.ascontiguousarray(flow)
119
+
120
+ return img1, img2, flow
121
+
122
+ class SparseFlowAugmentor:
123
+ def __init__(self, crop_size, min_scale=-0.2, max_scale=0.5, do_flip=False):
124
+ # spatial augmentation params
125
+ self.crop_size = crop_size
126
+ self.min_scale = min_scale
127
+ self.max_scale = max_scale
128
+ self.spatial_aug_prob = 0.8
129
+ self.stretch_prob = 0.8
130
+ self.max_stretch = 0.2
131
+
132
+ # flip augmentation params
133
+ self.do_flip = do_flip
134
+ self.h_flip_prob = 0.5
135
+ self.v_flip_prob = 0.1
136
+
137
+ # photometric augmentation params
138
+ self.photo_aug = ColorJitter(brightness=0.3, contrast=0.3, saturation=0.3, hue=0.3/3.14)
139
+ self.asymmetric_color_aug_prob = 0.2
140
+ self.eraser_aug_prob = 0.5
141
+
142
+ def color_transform(self, img1, img2):
143
+ image_stack = np.concatenate([img1, img2], axis=0)
144
+ image_stack = np.array(self.photo_aug(Image.fromarray(image_stack)), dtype=np.uint8)
145
+ img1, img2 = np.split(image_stack, 2, axis=0)
146
+ return img1, img2
147
+
148
+ def eraser_transform(self, img1, img2):
149
+ ht, wd = img1.shape[:2]
150
+ if np.random.rand() < self.eraser_aug_prob:
151
+ mean_color = np.mean(img2.reshape(-1, 3), axis=0)
152
+ for _ in range(np.random.randint(1, 3)):
153
+ x0 = np.random.randint(0, wd)
154
+ y0 = np.random.randint(0, ht)
155
+ dx = np.random.randint(50, 100)
156
+ dy = np.random.randint(50, 100)
157
+ img2[y0:y0+dy, x0:x0+dx, :] = mean_color
158
+
159
+ return img1, img2
160
+
161
+ def resize_sparse_flow_map(self, flow, valid, fx=1.0, fy=1.0):
162
+ ht, wd = flow.shape[:2]
163
+ coords = np.meshgrid(np.arange(wd), np.arange(ht))
164
+ coords = np.stack(coords, axis=-1)
165
+
166
+ coords = coords.reshape(-1, 2).astype(np.float32)
167
+ flow = flow.reshape(-1, 2).astype(np.float32)
168
+ valid = valid.reshape(-1).astype(np.float32)
169
+
170
+ coords0 = coords[valid>=1]
171
+ flow0 = flow[valid>=1]
172
+
173
+ ht1 = int(round(ht * fy))
174
+ wd1 = int(round(wd * fx))
175
+
176
+ coords1 = coords0 * [fx, fy]
177
+ flow1 = flow0 * [fx, fy]
178
+
179
+ xx = np.round(coords1[:,0]).astype(np.int32)
180
+ yy = np.round(coords1[:,1]).astype(np.int32)
181
+
182
+ v = (xx > 0) & (xx < wd1) & (yy > 0) & (yy < ht1)
183
+ xx = xx[v]
184
+ yy = yy[v]
185
+ flow1 = flow1[v]
186
+
187
+ flow_img = np.zeros([ht1, wd1, 2], dtype=np.float32)
188
+ valid_img = np.zeros([ht1, wd1], dtype=np.int32)
189
+
190
+ flow_img[yy, xx] = flow1
191
+ valid_img[yy, xx] = 1
192
+
193
+ return flow_img, valid_img
194
+
195
+ def spatial_transform(self, img1, img2, flow, valid):
196
+ # randomly sample scale
197
+
198
+ ht, wd = img1.shape[:2]
199
+ min_scale = np.maximum(
200
+ (self.crop_size[0] + 1) / float(ht),
201
+ (self.crop_size[1] + 1) / float(wd))
202
+
203
+ scale = 2 ** np.random.uniform(self.min_scale, self.max_scale)
204
+ scale_x = np.clip(scale, min_scale, None)
205
+ scale_y = np.clip(scale, min_scale, None)
206
+
207
+ if np.random.rand() < self.spatial_aug_prob:
208
+ # rescale the images
209
+ img1 = cv2.resize(img1, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR)
210
+ img2 = cv2.resize(img2, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR)
211
+ flow, valid = self.resize_sparse_flow_map(flow, valid, fx=scale_x, fy=scale_y)
212
+
213
+ if self.do_flip:
214
+ if np.random.rand() < 0.5: # h-flip
215
+ img1 = img1[:, ::-1]
216
+ img2 = img2[:, ::-1]
217
+ flow = flow[:, ::-1] * [-1.0, 1.0]
218
+ valid = valid[:, ::-1]
219
+
220
+ margin_y = 20
221
+ margin_x = 50
222
+
223
+ y0 = np.random.randint(0, img1.shape[0] - self.crop_size[0] + margin_y)
224
+ x0 = np.random.randint(-margin_x, img1.shape[1] - self.crop_size[1] + margin_x)
225
+
226
+ y0 = np.clip(y0, 0, img1.shape[0] - self.crop_size[0])
227
+ x0 = np.clip(x0, 0, img1.shape[1] - self.crop_size[1])
228
+
229
+ img1 = img1[y0:y0+self.crop_size[0], x0:x0+self.crop_size[1]]
230
+ img2 = img2[y0:y0+self.crop_size[0], x0:x0+self.crop_size[1]]
231
+ flow = flow[y0:y0+self.crop_size[0], x0:x0+self.crop_size[1]]
232
+ valid = valid[y0:y0+self.crop_size[0], x0:x0+self.crop_size[1]]
233
+ return img1, img2, flow, valid
234
+
235
+
236
+ def __call__(self, img1, img2, flow, valid):
237
+ img1, img2 = self.color_transform(img1, img2)
238
+ img1, img2 = self.eraser_transform(img1, img2)
239
+ img1, img2, flow, valid = self.spatial_transform(img1, img2, flow, valid)
240
+
241
+ img1 = np.ascontiguousarray(img1)
242
+ img2 = np.ascontiguousarray(img2)
243
+ flow = np.ascontiguousarray(flow)
244
+ valid = np.ascontiguousarray(valid)
245
+
246
+ return img1, img2, flow, valid
vtoonify/model/raft/core/utils/flow_viz.py ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Flow visualization code used from https://github.com/tomrunia/OpticalFlow_Visualization
2
+
3
+
4
+ # MIT License
5
+ #
6
+ # Copyright (c) 2018 Tom Runia
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to conditions.
14
+ #
15
+ # Author: Tom Runia
16
+ # Date Created: 2018-08-03
17
+
18
+ import numpy as np
19
+
20
+ def make_colorwheel():
21
+ """
22
+ Generates a color wheel for optical flow visualization as presented in:
23
+ Baker et al. "A Database and Evaluation Methodology for Optical Flow" (ICCV, 2007)
24
+ URL: http://vision.middlebury.edu/flow/flowEval-iccv07.pdf
25
+
26
+ Code follows the original C++ source code of Daniel Scharstein.
27
+ Code follows the the Matlab source code of Deqing Sun.
28
+
29
+ Returns:
30
+ np.ndarray: Color wheel
31
+ """
32
+
33
+ RY = 15
34
+ YG = 6
35
+ GC = 4
36
+ CB = 11
37
+ BM = 13
38
+ MR = 6
39
+
40
+ ncols = RY + YG + GC + CB + BM + MR
41
+ colorwheel = np.zeros((ncols, 3))
42
+ col = 0
43
+
44
+ # RY
45
+ colorwheel[0:RY, 0] = 255
46
+ colorwheel[0:RY, 1] = np.floor(255*np.arange(0,RY)/RY)
47
+ col = col+RY
48
+ # YG
49
+ colorwheel[col:col+YG, 0] = 255 - np.floor(255*np.arange(0,YG)/YG)
50
+ colorwheel[col:col+YG, 1] = 255
51
+ col = col+YG
52
+ # GC
53
+ colorwheel[col:col+GC, 1] = 255
54
+ colorwheel[col:col+GC, 2] = np.floor(255*np.arange(0,GC)/GC)
55
+ col = col+GC
56
+ # CB
57
+ colorwheel[col:col+CB, 1] = 255 - np.floor(255*np.arange(CB)/CB)
58
+ colorwheel[col:col+CB, 2] = 255
59
+ col = col+CB
60
+ # BM
61
+ colorwheel[col:col+BM, 2] = 255
62
+ colorwheel[col:col+BM, 0] = np.floor(255*np.arange(0,BM)/BM)
63
+ col = col+BM
64
+ # MR
65
+ colorwheel[col:col+MR, 2] = 255 - np.floor(255*np.arange(MR)/MR)
66
+ colorwheel[col:col+MR, 0] = 255
67
+ return colorwheel
68
+
69
+
70
+ def flow_uv_to_colors(u, v, convert_to_bgr=False):
71
+ """
72
+ Applies the flow color wheel to (possibly clipped) flow components u and v.
73
+
74
+ According to the C++ source code of Daniel Scharstein
75
+ According to the Matlab source code of Deqing Sun
76
+
77
+ Args:
78
+ u (np.ndarray): Input horizontal flow of shape [H,W]
79
+ v (np.ndarray): Input vertical flow of shape [H,W]
80
+ convert_to_bgr (bool, optional): Convert output image to BGR. Defaults to False.
81
+
82
+ Returns:
83
+ np.ndarray: Flow visualization image of shape [H,W,3]
84
+ """
85
+ flow_image = np.zeros((u.shape[0], u.shape[1], 3), np.uint8)
86
+ colorwheel = make_colorwheel() # shape [55x3]
87
+ ncols = colorwheel.shape[0]
88
+ rad = np.sqrt(np.square(u) + np.square(v))
89
+ a = np.arctan2(-v, -u)/np.pi
90
+ fk = (a+1) / 2*(ncols-1)
91
+ k0 = np.floor(fk).astype(np.int32)
92
+ k1 = k0 + 1
93
+ k1[k1 == ncols] = 0
94
+ f = fk - k0
95
+ for i in range(colorwheel.shape[1]):
96
+ tmp = colorwheel[:,i]
97
+ col0 = tmp[k0] / 255.0
98
+ col1 = tmp[k1] / 255.0
99
+ col = (1-f)*col0 + f*col1
100
+ idx = (rad <= 1)
101
+ col[idx] = 1 - rad[idx] * (1-col[idx])
102
+ col[~idx] = col[~idx] * 0.75 # out of range
103
+ # Note the 2-i => BGR instead of RGB
104
+ ch_idx = 2-i if convert_to_bgr else i
105
+ flow_image[:,:,ch_idx] = np.floor(255 * col)
106
+ return flow_image
107
+
108
+
109
+ def flow_to_image(flow_uv, clip_flow=None, convert_to_bgr=False):
110
+ """
111
+ Expects a two dimensional flow image of shape.
112
+
113
+ Args:
114
+ flow_uv (np.ndarray): Flow UV image of shape [H,W,2]
115
+ clip_flow (float, optional): Clip maximum of flow values. Defaults to None.
116
+ convert_to_bgr (bool, optional): Convert output image to BGR. Defaults to False.
117
+
118
+ Returns:
119
+ np.ndarray: Flow visualization image of shape [H,W,3]
120
+ """
121
+ assert flow_uv.ndim == 3, 'input flow must have three dimensions'
122
+ assert flow_uv.shape[2] == 2, 'input flow must have shape [H,W,2]'
123
+ if clip_flow is not None:
124
+ flow_uv = np.clip(flow_uv, 0, clip_flow)
125
+ u = flow_uv[:,:,0]
126
+ v = flow_uv[:,:,1]
127
+ rad = np.sqrt(np.square(u) + np.square(v))
128
+ rad_max = np.max(rad)
129
+ epsilon = 1e-5
130
+ u = u / (rad_max + epsilon)
131
+ v = v / (rad_max + epsilon)
132
+ return flow_uv_to_colors(u, v, convert_to_bgr)
vtoonify/model/raft/core/utils/frame_utils.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ from PIL import Image
3
+ from os.path import *
4
+ import re
5
+
6
+ import cv2
7
+ cv2.setNumThreads(0)
8
+ cv2.ocl.setUseOpenCL(False)
9
+
10
+ TAG_CHAR = np.array([202021.25], np.float32)
11
+
12
+ def readFlow(fn):
13
+ """ Read .flo file in Middlebury format"""
14
+ # Code adapted from:
15
+ # http://stackoverflow.com/questions/28013200/reading-middlebury-flow-files-with-python-bytes-array-numpy
16
+
17
+ # WARNING: this will work on little-endian architectures (eg Intel x86) only!
18
+ # print 'fn = %s'%(fn)
19
+ with open(fn, 'rb') as f:
20
+ magic = np.fromfile(f, np.float32, count=1)
21
+ if 202021.25 != magic:
22
+ print('Magic number incorrect. Invalid .flo file')
23
+ return None
24
+ else:
25
+ w = np.fromfile(f, np.int32, count=1)
26
+ h = np.fromfile(f, np.int32, count=1)
27
+ # print 'Reading %d x %d flo file\n' % (w, h)
28
+ data = np.fromfile(f, np.float32, count=2*int(w)*int(h))
29
+ # Reshape data into 3D array (columns, rows, bands)
30
+ # The reshape here is for visualization, the original code is (w,h,2)
31
+ return np.resize(data, (int(h), int(w), 2))
32
+
33
+ def readPFM(file):
34
+ file = open(file, 'rb')
35
+
36
+ color = None
37
+ width = None
38
+ height = None
39
+ scale = None
40
+ endian = None
41
+
42
+ header = file.readline().rstrip()
43
+ if header == b'PF':
44
+ color = True
45
+ elif header == b'Pf':
46
+ color = False
47
+ else:
48
+ raise Exception('Not a PFM file.')
49
+
50
+ dim_match = re.match(rb'^(\d+)\s(\d+)\s$', file.readline())
51
+ if dim_match:
52
+ width, height = map(int, dim_match.groups())
53
+ else:
54
+ raise Exception('Malformed PFM header.')
55
+
56
+ scale = float(file.readline().rstrip())
57
+ if scale < 0: # little-endian
58
+ endian = '<'
59
+ scale = -scale
60
+ else:
61
+ endian = '>' # big-endian
62
+
63
+ data = np.fromfile(file, endian + 'f')
64
+ shape = (height, width, 3) if color else (height, width)
65
+
66
+ data = np.reshape(data, shape)
67
+ data = np.flipud(data)
68
+ return data
69
+
70
+ def writeFlow(filename,uv,v=None):
71
+ """ Write optical flow to file.
72
+
73
+ If v is None, uv is assumed to contain both u and v channels,
74
+ stacked in depth.
75
+ Original code by Deqing Sun, adapted from Daniel Scharstein.
76
+ """
77
+ nBands = 2
78
+
79
+ if v is None:
80
+ assert(uv.ndim == 3)
81
+ assert(uv.shape[2] == 2)
82
+ u = uv[:,:,0]
83
+ v = uv[:,:,1]
84
+ else:
85
+ u = uv
86
+
87
+ assert(u.shape == v.shape)
88
+ height,width = u.shape
89
+ f = open(filename,'wb')
90
+ # write the header
91
+ f.write(TAG_CHAR)
92
+ np.array(width).astype(np.int32).tofile(f)
93
+ np.array(height).astype(np.int32).tofile(f)
94
+ # arrange into matrix form
95
+ tmp = np.zeros((height, width*nBands))
96
+ tmp[:,np.arange(width)*2] = u
97
+ tmp[:,np.arange(width)*2 + 1] = v
98
+ tmp.astype(np.float32).tofile(f)
99
+ f.close()
100
+
101
+
102
+ def readFlowKITTI(filename):
103
+ flow = cv2.imread(filename, cv2.IMREAD_ANYDEPTH|cv2.IMREAD_COLOR)
104
+ flow = flow[:,:,::-1].astype(np.float32)
105
+ flow, valid = flow[:, :, :2], flow[:, :, 2]
106
+ flow = (flow - 2**15) / 64.0
107
+ return flow, valid
108
+
109
+ def readDispKITTI(filename):
110
+ disp = cv2.imread(filename, cv2.IMREAD_ANYDEPTH) / 256.0
111
+ valid = disp > 0.0
112
+ flow = np.stack([-disp, np.zeros_like(disp)], -1)
113
+ return flow, valid
114
+
115
+
116
+ def writeFlowKITTI(filename, uv):
117
+ uv = 64.0 * uv + 2**15
118
+ valid = np.ones([uv.shape[0], uv.shape[1], 1])
119
+ uv = np.concatenate([uv, valid], axis=-1).astype(np.uint16)
120
+ cv2.imwrite(filename, uv[..., ::-1])
121
+
122
+
123
+ def read_gen(file_name, pil=False):
124
+ ext = splitext(file_name)[-1]
125
+ if ext == '.png' or ext == '.jpeg' or ext == '.ppm' or ext == '.jpg':
126
+ return Image.open(file_name)
127
+ elif ext == '.bin' or ext == '.raw':
128
+ return np.load(file_name)
129
+ elif ext == '.flo':
130
+ return readFlow(file_name).astype(np.float32)
131
+ elif ext == '.pfm':
132
+ flow = readPFM(file_name).astype(np.float32)
133
+ if len(flow.shape) == 2:
134
+ return flow
135
+ else:
136
+ return flow[:, :, :-1]
137
+ return []
vtoonify/model/raft/core/utils/utils.py ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn.functional as F
3
+ import numpy as np
4
+ from scipy import interpolate
5
+
6
+
7
+ class InputPadder:
8
+ """ Pads images such that dimensions are divisible by 8 """
9
+ def __init__(self, dims, mode='sintel'):
10
+ self.ht, self.wd = dims[-2:]
11
+ pad_ht = (((self.ht // 8) + 1) * 8 - self.ht) % 8
12
+ pad_wd = (((self.wd // 8) + 1) * 8 - self.wd) % 8
13
+ if mode == 'sintel':
14
+ self._pad = [pad_wd//2, pad_wd - pad_wd//2, pad_ht//2, pad_ht - pad_ht//2]
15
+ else:
16
+ self._pad = [pad_wd//2, pad_wd - pad_wd//2, 0, pad_ht]
17
+
18
+ def pad(self, *inputs):
19
+ return [F.pad(x, self._pad, mode='replicate') for x in inputs]
20
+
21
+ def unpad(self,x):
22
+ ht, wd = x.shape[-2:]
23
+ c = [self._pad[2], ht-self._pad[3], self._pad[0], wd-self._pad[1]]
24
+ return x[..., c[0]:c[1], c[2]:c[3]]
25
+
26
+ def forward_interpolate(flow):
27
+ flow = flow.detach().cpu().numpy()
28
+ dx, dy = flow[0], flow[1]
29
+
30
+ ht, wd = dx.shape
31
+ x0, y0 = np.meshgrid(np.arange(wd), np.arange(ht))
32
+
33
+ x1 = x0 + dx
34
+ y1 = y0 + dy
35
+
36
+ x1 = x1.reshape(-1)
37
+ y1 = y1.reshape(-1)
38
+ dx = dx.reshape(-1)
39
+ dy = dy.reshape(-1)
40
+
41
+ valid = (x1 > 0) & (x1 < wd) & (y1 > 0) & (y1 < ht)
42
+ x1 = x1[valid]
43
+ y1 = y1[valid]
44
+ dx = dx[valid]
45
+ dy = dy[valid]
46
+
47
+ flow_x = interpolate.griddata(
48
+ (x1, y1), dx, (x0, y0), method='nearest', fill_value=0)
49
+
50
+ flow_y = interpolate.griddata(
51
+ (x1, y1), dy, (x0, y0), method='nearest', fill_value=0)
52
+
53
+ flow = np.stack([flow_x, flow_y], axis=0)
54
+ return torch.from_numpy(flow).float()
55
+
56
+
57
+ def bilinear_sampler(img, coords, mode='bilinear', mask=False):
58
+ """ Wrapper for grid_sample, uses pixel coordinates """
59
+ H, W = img.shape[-2:]
60
+ xgrid, ygrid = coords.split([1,1], dim=-1)
61
+ xgrid = 2*xgrid/(W-1) - 1
62
+ ygrid = 2*ygrid/(H-1) - 1
63
+
64
+ grid = torch.cat([xgrid, ygrid], dim=-1)
65
+ img = F.grid_sample(img, grid, align_corners=True)
66
+
67
+ if mask:
68
+ mask = (xgrid > -1) & (ygrid > -1) & (xgrid < 1) & (ygrid < 1)
69
+ return img, mask.float()
70
+
71
+ return img
72
+
73
+
74
+ def coords_grid(batch, ht, wd, device):
75
+ coords = torch.meshgrid(torch.arange(ht, device=device), torch.arange(wd, device=device))
76
+ coords = torch.stack(coords[::-1], dim=0).float()
77
+ return coords[None].repeat(batch, 1, 1, 1)
78
+
79
+
80
+ def upflow8(flow, mode='bilinear'):
81
+ new_size = (8 * flow.shape[2], 8 * flow.shape[3])
82
+ return 8 * F.interpolate(flow, size=new_size, mode=mode, align_corners=True)
vtoonify/model/raft/demo.py ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ sys.path.append('core')
3
+
4
+ import argparse
5
+ import os
6
+ import cv2
7
+ import glob
8
+ import numpy as np
9
+ import torch
10
+ from PIL import Image
11
+
12
+ from raft import RAFT
13
+ from utils import flow_viz
14
+ from utils.utils import InputPadder
15
+
16
+
17
+
18
+ DEVICE = 'cuda'
19
+
20
+ def load_image(imfile):
21
+ img = np.array(Image.open(imfile)).astype(np.uint8)
22
+ img = torch.from_numpy(img).permute(2, 0, 1).float()
23
+ return img[None].to(DEVICE)
24
+
25
+
26
+ def viz(img, flo):
27
+ img = img[0].permute(1,2,0).cpu().numpy()
28
+ flo = flo[0].permute(1,2,0).cpu().numpy()
29
+
30
+ # map flow to rgb image
31
+ flo = flow_viz.flow_to_image(flo)
32
+ img_flo = np.concatenate([img, flo], axis=0)
33
+
34
+ # import matplotlib.pyplot as plt
35
+ # plt.imshow(img_flo / 255.0)
36
+ # plt.show()
37
+
38
+ cv2.imshow('image', img_flo[:, :, [2,1,0]]/255.0)
39
+ cv2.waitKey()
40
+
41
+
42
+ def demo(args):
43
+ model = torch.nn.DataParallel(RAFT(args))
44
+ model.load_state_dict(torch.load(args.model))
45
+
46
+ model = model.module
47
+ model.to(DEVICE)
48
+ model.eval()
49
+
50
+ with torch.no_grad():
51
+ images = glob.glob(os.path.join(args.path, '*.png')) + \
52
+ glob.glob(os.path.join(args.path, '*.jpg'))
53
+
54
+ images = sorted(images)
55
+ for imfile1, imfile2 in zip(images[:-1], images[1:]):
56
+ image1 = load_image(imfile1)
57
+ image2 = load_image(imfile2)
58
+
59
+ padder = InputPadder(image1.shape)
60
+ image1, image2 = padder.pad(image1, image2)
61
+
62
+ flow_low, flow_up = model(image1, image2, iters=20, test_mode=True)
63
+ viz(image1, flow_up)
64
+
65
+
66
+ if __name__ == '__main__':
67
+ parser = argparse.ArgumentParser()
68
+ parser.add_argument('--model', help="restore checkpoint")
69
+ parser.add_argument('--path', help="dataset for evaluation")
70
+ parser.add_argument('--small', action='store_true', help='use small model')
71
+ parser.add_argument('--mixed_precision', action='store_true', help='use mixed precision')
72
+ parser.add_argument('--alternate_corr', action='store_true', help='use efficent correlation implementation')
73
+ args = parser.parse_args()
74
+
75
+ demo(args)
vtoonify/model/raft/download_models.sh ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ #!/bin/bash
2
+ wget https://www.dropbox.com/s/4j4z58wuv8o0mfz/models.zip
3
+ unzip models.zip
vtoonify/model/raft/evaluate.py ADDED
@@ -0,0 +1,197 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ sys.path.append('core')
3
+
4
+ from PIL import Image
5
+ import argparse
6
+ import os
7
+ import time
8
+ import numpy as np
9
+ import torch
10
+ import torch.nn.functional as F
11
+ import matplotlib.pyplot as plt
12
+
13
+ import datasets
14
+ from utils import flow_viz
15
+ from utils import frame_utils
16
+
17
+ from raft import RAFT
18
+ from utils.utils import InputPadder, forward_interpolate
19
+
20
+
21
+ @torch.no_grad()
22
+ def create_sintel_submission(model, iters=32, warm_start=False, output_path='sintel_submission'):
23
+ """ Create submission for the Sintel leaderboard """
24
+ model.eval()
25
+ for dstype in ['clean', 'final']:
26
+ test_dataset = datasets.MpiSintel(split='test', aug_params=None, dstype=dstype)
27
+
28
+ flow_prev, sequence_prev = None, None
29
+ for test_id in range(len(test_dataset)):
30
+ image1, image2, (sequence, frame) = test_dataset[test_id]
31
+ if sequence != sequence_prev:
32
+ flow_prev = None
33
+
34
+ padder = InputPadder(image1.shape)
35
+ image1, image2 = padder.pad(image1[None].cuda(), image2[None].cuda())
36
+
37
+ flow_low, flow_pr = model(image1, image2, iters=iters, flow_init=flow_prev, test_mode=True)
38
+ flow = padder.unpad(flow_pr[0]).permute(1, 2, 0).cpu().numpy()
39
+
40
+ if warm_start:
41
+ flow_prev = forward_interpolate(flow_low[0])[None].cuda()
42
+
43
+ output_dir = os.path.join(output_path, dstype, sequence)
44
+ output_file = os.path.join(output_dir, 'frame%04d.flo' % (frame+1))
45
+
46
+ if not os.path.exists(output_dir):
47
+ os.makedirs(output_dir)
48
+
49
+ frame_utils.writeFlow(output_file, flow)
50
+ sequence_prev = sequence
51
+
52
+
53
+ @torch.no_grad()
54
+ def create_kitti_submission(model, iters=24, output_path='kitti_submission'):
55
+ """ Create submission for the Sintel leaderboard """
56
+ model.eval()
57
+ test_dataset = datasets.KITTI(split='testing', aug_params=None)
58
+
59
+ if not os.path.exists(output_path):
60
+ os.makedirs(output_path)
61
+
62
+ for test_id in range(len(test_dataset)):
63
+ image1, image2, (frame_id, ) = test_dataset[test_id]
64
+ padder = InputPadder(image1.shape, mode='kitti')
65
+ image1, image2 = padder.pad(image1[None].cuda(), image2[None].cuda())
66
+
67
+ _, flow_pr = model(image1, image2, iters=iters, test_mode=True)
68
+ flow = padder.unpad(flow_pr[0]).permute(1, 2, 0).cpu().numpy()
69
+
70
+ output_filename = os.path.join(output_path, frame_id)
71
+ frame_utils.writeFlowKITTI(output_filename, flow)
72
+
73
+
74
+ @torch.no_grad()
75
+ def validate_chairs(model, iters=24):
76
+ """ Perform evaluation on the FlyingChairs (test) split """
77
+ model.eval()
78
+ epe_list = []
79
+
80
+ val_dataset = datasets.FlyingChairs(split='validation')
81
+ for val_id in range(len(val_dataset)):
82
+ image1, image2, flow_gt, _ = val_dataset[val_id]
83
+ image1 = image1[None].cuda()
84
+ image2 = image2[None].cuda()
85
+
86
+ _, flow_pr = model(image1, image2, iters=iters, test_mode=True)
87
+ epe = torch.sum((flow_pr[0].cpu() - flow_gt)**2, dim=0).sqrt()
88
+ epe_list.append(epe.view(-1).numpy())
89
+
90
+ epe = np.mean(np.concatenate(epe_list))
91
+ print("Validation Chairs EPE: %f" % epe)
92
+ return {'chairs': epe}
93
+
94
+
95
+ @torch.no_grad()
96
+ def validate_sintel(model, iters=32):
97
+ """ Peform validation using the Sintel (train) split """
98
+ model.eval()
99
+ results = {}
100
+ for dstype in ['clean', 'final']:
101
+ val_dataset = datasets.MpiSintel(split='training', dstype=dstype)
102
+ epe_list = []
103
+
104
+ for val_id in range(len(val_dataset)):
105
+ image1, image2, flow_gt, _ = val_dataset[val_id]
106
+ image1 = image1[None].cuda()
107
+ image2 = image2[None].cuda()
108
+
109
+ padder = InputPadder(image1.shape)
110
+ image1, image2 = padder.pad(image1, image2)
111
+
112
+ flow_low, flow_pr = model(image1, image2, iters=iters, test_mode=True)
113
+ flow = padder.unpad(flow_pr[0]).cpu()
114
+
115
+ epe = torch.sum((flow - flow_gt)**2, dim=0).sqrt()
116
+ epe_list.append(epe.view(-1).numpy())
117
+
118
+ epe_all = np.concatenate(epe_list)
119
+ epe = np.mean(epe_all)
120
+ px1 = np.mean(epe_all<1)
121
+ px3 = np.mean(epe_all<3)
122
+ px5 = np.mean(epe_all<5)
123
+
124
+ print("Validation (%s) EPE: %f, 1px: %f, 3px: %f, 5px: %f" % (dstype, epe, px1, px3, px5))
125
+ results[dstype] = np.mean(epe_list)
126
+
127
+ return results
128
+
129
+
130
+ @torch.no_grad()
131
+ def validate_kitti(model, iters=24):
132
+ """ Peform validation using the KITTI-2015 (train) split """
133
+ model.eval()
134
+ val_dataset = datasets.KITTI(split='training')
135
+
136
+ out_list, epe_list = [], []
137
+ for val_id in range(len(val_dataset)):
138
+ image1, image2, flow_gt, valid_gt = val_dataset[val_id]
139
+ image1 = image1[None].cuda()
140
+ image2 = image2[None].cuda()
141
+
142
+ padder = InputPadder(image1.shape, mode='kitti')
143
+ image1, image2 = padder.pad(image1, image2)
144
+
145
+ flow_low, flow_pr = model(image1, image2, iters=iters, test_mode=True)
146
+ flow = padder.unpad(flow_pr[0]).cpu()
147
+
148
+ epe = torch.sum((flow - flow_gt)**2, dim=0).sqrt()
149
+ mag = torch.sum(flow_gt**2, dim=0).sqrt()
150
+
151
+ epe = epe.view(-1)
152
+ mag = mag.view(-1)
153
+ val = valid_gt.view(-1) >= 0.5
154
+
155
+ out = ((epe > 3.0) & ((epe/mag) > 0.05)).float()
156
+ epe_list.append(epe[val].mean().item())
157
+ out_list.append(out[val].cpu().numpy())
158
+
159
+ epe_list = np.array(epe_list)
160
+ out_list = np.concatenate(out_list)
161
+
162
+ epe = np.mean(epe_list)
163
+ f1 = 100 * np.mean(out_list)
164
+
165
+ print("Validation KITTI: %f, %f" % (epe, f1))
166
+ return {'kitti-epe': epe, 'kitti-f1': f1}
167
+
168
+
169
+ if __name__ == '__main__':
170
+ parser = argparse.ArgumentParser()
171
+ parser.add_argument('--model', help="restore checkpoint")
172
+ parser.add_argument('--dataset', help="dataset for evaluation")
173
+ parser.add_argument('--small', action='store_true', help='use small model')
174
+ parser.add_argument('--mixed_precision', action='store_true', help='use mixed precision')
175
+ parser.add_argument('--alternate_corr', action='store_true', help='use efficent correlation implementation')
176
+ args = parser.parse_args()
177
+
178
+ model = torch.nn.DataParallel(RAFT(args))
179
+ model.load_state_dict(torch.load(args.model))
180
+
181
+ model.cuda()
182
+ model.eval()
183
+
184
+ # create_sintel_submission(model.module, warm_start=True)
185
+ # create_kitti_submission(model.module)
186
+
187
+ with torch.no_grad():
188
+ if args.dataset == 'chairs':
189
+ validate_chairs(model.module)
190
+
191
+ elif args.dataset == 'sintel':
192
+ validate_sintel(model.module)
193
+
194
+ elif args.dataset == 'kitti':
195
+ validate_kitti(model.module)
196
+
197
+
vtoonify/model/raft/train.py ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import print_function, division
2
+ import sys
3
+ sys.path.append('core')
4
+
5
+ import argparse
6
+ import os
7
+ import cv2
8
+ import time
9
+ import numpy as np
10
+ import matplotlib.pyplot as plt
11
+
12
+ import torch
13
+ import torch.nn as nn
14
+ import torch.optim as optim
15
+ import torch.nn.functional as F
16
+
17
+ from torch.utils.data import DataLoader
18
+ from raft import RAFT
19
+ import evaluate
20
+ import datasets
21
+
22
+ from torch.utils.tensorboard import SummaryWriter
23
+
24
+ try:
25
+ from torch.cuda.amp import GradScaler
26
+ except:
27
+ # dummy GradScaler for PyTorch < 1.6
28
+ class GradScaler:
29
+ def __init__(self):
30
+ pass
31
+ def scale(self, loss):
32
+ return loss
33
+ def unscale_(self, optimizer):
34
+ pass
35
+ def step(self, optimizer):
36
+ optimizer.step()
37
+ def update(self):
38
+ pass
39
+
40
+
41
+ # exclude extremly large displacements
42
+ MAX_FLOW = 400
43
+ SUM_FREQ = 100
44
+ VAL_FREQ = 5000
45
+
46
+
47
+ def sequence_loss(flow_preds, flow_gt, valid, gamma=0.8, max_flow=MAX_FLOW):
48
+ """ Loss function defined over sequence of flow predictions """
49
+
50
+ n_predictions = len(flow_preds)
51
+ flow_loss = 0.0
52
+
53
+ # exlude invalid pixels and extremely large diplacements
54
+ mag = torch.sum(flow_gt**2, dim=1).sqrt()
55
+ valid = (valid >= 0.5) & (mag < max_flow)
56
+
57
+ for i in range(n_predictions):
58
+ i_weight = gamma**(n_predictions - i - 1)
59
+ i_loss = (flow_preds[i] - flow_gt).abs()
60
+ flow_loss += i_weight * (valid[:, None] * i_loss).mean()
61
+
62
+ epe = torch.sum((flow_preds[-1] - flow_gt)**2, dim=1).sqrt()
63
+ epe = epe.view(-1)[valid.view(-1)]
64
+
65
+ metrics = {
66
+ 'epe': epe.mean().item(),
67
+ '1px': (epe < 1).float().mean().item(),
68
+ '3px': (epe < 3).float().mean().item(),
69
+ '5px': (epe < 5).float().mean().item(),
70
+ }
71
+
72
+ return flow_loss, metrics
73
+
74
+
75
+ def count_parameters(model):
76
+ return sum(p.numel() for p in model.parameters() if p.requires_grad)
77
+
78
+
79
+ def fetch_optimizer(args, model):
80
+ """ Create the optimizer and learning rate scheduler """
81
+ optimizer = optim.AdamW(model.parameters(), lr=args.lr, weight_decay=args.wdecay, eps=args.epsilon)
82
+
83
+ scheduler = optim.lr_scheduler.OneCycleLR(optimizer, args.lr, args.num_steps+100,
84
+ pct_start=0.05, cycle_momentum=False, anneal_strategy='linear')
85
+
86
+ return optimizer, scheduler
87
+
88
+
89
+ class Logger:
90
+ def __init__(self, model, scheduler):
91
+ self.model = model
92
+ self.scheduler = scheduler
93
+ self.total_steps = 0
94
+ self.running_loss = {}
95
+ self.writer = None
96
+
97
+ def _print_training_status(self):
98
+ metrics_data = [self.running_loss[k]/SUM_FREQ for k in sorted(self.running_loss.keys())]
99
+ training_str = "[{:6d}, {:10.7f}] ".format(self.total_steps+1, self.scheduler.get_last_lr()[0])
100
+ metrics_str = ("{:10.4f}, "*len(metrics_data)).format(*metrics_data)
101
+
102
+ # print the training status
103
+ print(training_str + metrics_str)
104
+
105
+ if self.writer is None:
106
+ self.writer = SummaryWriter()
107
+
108
+ for k in self.running_loss:
109
+ self.writer.add_scalar(k, self.running_loss[k]/SUM_FREQ, self.total_steps)
110
+ self.running_loss[k] = 0.0
111
+
112
+ def push(self, metrics):
113
+ self.total_steps += 1
114
+
115
+ for key in metrics:
116
+ if key not in self.running_loss:
117
+ self.running_loss[key] = 0.0
118
+
119
+ self.running_loss[key] += metrics[key]
120
+
121
+ if self.total_steps % SUM_FREQ == SUM_FREQ-1:
122
+ self._print_training_status()
123
+ self.running_loss = {}
124
+
125
+ def write_dict(self, results):
126
+ if self.writer is None:
127
+ self.writer = SummaryWriter()
128
+
129
+ for key in results:
130
+ self.writer.add_scalar(key, results[key], self.total_steps)
131
+
132
+ def close(self):
133
+ self.writer.close()
134
+
135
+
136
+ def train(args):
137
+
138
+ model = nn.DataParallel(RAFT(args), device_ids=args.gpus)
139
+ print("Parameter Count: %d" % count_parameters(model))
140
+
141
+ if args.restore_ckpt is not None:
142
+ model.load_state_dict(torch.load(args.restore_ckpt), strict=False)
143
+
144
+ model.cuda()
145
+ model.train()
146
+
147
+ if args.stage != 'chairs':
148
+ model.module.freeze_bn()
149
+
150
+ train_loader = datasets.fetch_dataloader(args)
151
+ optimizer, scheduler = fetch_optimizer(args, model)
152
+
153
+ total_steps = 0
154
+ scaler = GradScaler(enabled=args.mixed_precision)
155
+ logger = Logger(model, scheduler)
156
+
157
+ VAL_FREQ = 5000
158
+ add_noise = True
159
+
160
+ should_keep_training = True
161
+ while should_keep_training:
162
+
163
+ for i_batch, data_blob in enumerate(train_loader):
164
+ optimizer.zero_grad()
165
+ image1, image2, flow, valid = [x.cuda() for x in data_blob]
166
+
167
+ if args.add_noise:
168
+ stdv = np.random.uniform(0.0, 5.0)
169
+ image1 = (image1 + stdv * torch.randn(*image1.shape).cuda()).clamp(0.0, 255.0)
170
+ image2 = (image2 + stdv * torch.randn(*image2.shape).cuda()).clamp(0.0, 255.0)
171
+
172
+ flow_predictions = model(image1, image2, iters=args.iters)
173
+
174
+ loss, metrics = sequence_loss(flow_predictions, flow, valid, args.gamma)
175
+ scaler.scale(loss).backward()
176
+ scaler.unscale_(optimizer)
177
+ torch.nn.utils.clip_grad_norm_(model.parameters(), args.clip)
178
+
179
+ scaler.step(optimizer)
180
+ scheduler.step()
181
+ scaler.update()
182
+
183
+ logger.push(metrics)
184
+
185
+ if total_steps % VAL_FREQ == VAL_FREQ - 1:
186
+ PATH = 'checkpoints/%d_%s.pth' % (total_steps+1, args.name)
187
+ torch.save(model.state_dict(), PATH)
188
+
189
+ results = {}
190
+ for val_dataset in args.validation:
191
+ if val_dataset == 'chairs':
192
+ results.update(evaluate.validate_chairs(model.module))
193
+ elif val_dataset == 'sintel':
194
+ results.update(evaluate.validate_sintel(model.module))
195
+ elif val_dataset == 'kitti':
196
+ results.update(evaluate.validate_kitti(model.module))
197
+
198
+ logger.write_dict(results)
199
+
200
+ model.train()
201
+ if args.stage != 'chairs':
202
+ model.module.freeze_bn()
203
+
204
+ total_steps += 1
205
+
206
+ if total_steps > args.num_steps:
207
+ should_keep_training = False
208
+ break
209
+
210
+ logger.close()
211
+ PATH = 'checkpoints/%s.pth' % args.name
212
+ torch.save(model.state_dict(), PATH)
213
+
214
+ return PATH
215
+
216
+
217
+ if __name__ == '__main__':
218
+ parser = argparse.ArgumentParser()
219
+ parser.add_argument('--name', default='raft', help="name your experiment")
220
+ parser.add_argument('--stage', help="determines which dataset to use for training")
221
+ parser.add_argument('--restore_ckpt', help="restore checkpoint")
222
+ parser.add_argument('--small', action='store_true', help='use small model')
223
+ parser.add_argument('--validation', type=str, nargs='+')
224
+
225
+ parser.add_argument('--lr', type=float, default=0.00002)
226
+ parser.add_argument('--num_steps', type=int, default=100000)
227
+ parser.add_argument('--batch_size', type=int, default=6)
228
+ parser.add_argument('--image_size', type=int, nargs='+', default=[384, 512])
229
+ parser.add_argument('--gpus', type=int, nargs='+', default=[0,1])
230
+ parser.add_argument('--mixed_precision', action='store_true', help='use mixed precision')
231
+
232
+ parser.add_argument('--iters', type=int, default=12)
233
+ parser.add_argument('--wdecay', type=float, default=.00005)
234
+ parser.add_argument('--epsilon', type=float, default=1e-8)
235
+ parser.add_argument('--clip', type=float, default=1.0)
236
+ parser.add_argument('--dropout', type=float, default=0.0)
237
+ parser.add_argument('--gamma', type=float, default=0.8, help='exponential weighting')
238
+ parser.add_argument('--add_noise', action='store_true')
239
+ args = parser.parse_args()
240
+
241
+ torch.manual_seed(1234)
242
+ np.random.seed(1234)
243
+
244
+ if not os.path.isdir('checkpoints'):
245
+ os.mkdir('checkpoints')
246
+
247
+ train(args)
vtoonify/model/raft/train_mixed.sh ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ mkdir -p checkpoints
3
+ python -u train.py --name raft-chairs --stage chairs --validation chairs --gpus 0 --num_steps 120000 --batch_size 8 --lr 0.00025 --image_size 368 496 --wdecay 0.0001 --mixed_precision
4
+ python -u train.py --name raft-things --stage things --validation sintel --restore_ckpt checkpoints/raft-chairs.pth --gpus 0 --num_steps 120000 --batch_size 5 --lr 0.0001 --image_size 400 720 --wdecay 0.0001 --mixed_precision
5
+ python -u train.py --name raft-sintel --stage sintel --validation sintel --restore_ckpt checkpoints/raft-things.pth --gpus 0 --num_steps 120000 --batch_size 5 --lr 0.0001 --image_size 368 768 --wdecay 0.00001 --gamma=0.85 --mixed_precision
6
+ python -u train.py --name raft-kitti --stage kitti --validation kitti --restore_ckpt checkpoints/raft-sintel.pth --gpus 0 --num_steps 50000 --batch_size 5 --lr 0.0001 --image_size 288 960 --wdecay 0.00001 --gamma=0.85 --mixed_precision
vtoonify/model/raft/train_standard.sh ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ mkdir -p checkpoints
3
+ python -u train.py --name raft-chairs --stage chairs --validation chairs --gpus 0 1 --num_steps 100000 --batch_size 10 --lr 0.0004 --image_size 368 496 --wdecay 0.0001
4
+ python -u train.py --name raft-things --stage things --validation sintel --restore_ckpt checkpoints/raft-chairs.pth --gpus 0 1 --num_steps 100000 --batch_size 6 --lr 0.000125 --image_size 400 720 --wdecay 0.0001
5
+ python -u train.py --name raft-sintel --stage sintel --validation sintel --restore_ckpt checkpoints/raft-things.pth --gpus 0 1 --num_steps 100000 --batch_size 6 --lr 0.000125 --image_size 368 768 --wdecay 0.00001 --gamma=0.85
6
+ python -u train.py --name raft-kitti --stage kitti --validation kitti --restore_ckpt checkpoints/raft-sintel.pth --gpus 0 1 --num_steps 50000 --batch_size 6 --lr 0.0001 --image_size 288 960 --wdecay 0.00001 --gamma=0.85
vtoonify/model/simple_augment.py ADDED
@@ -0,0 +1,468 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # almost the same as model.stylegan.non_leaking
2
+ # we only modify the parameters in sample_affine() to make the transformations mild
3
+
4
+ import math
5
+
6
+ import torch
7
+ from torch import autograd
8
+ from torch.nn import functional as F
9
+ import numpy as np
10
+
11
+ from model.stylegan.distributed import reduce_sum
12
+ from model.stylegan.op import upfirdn2d
13
+
14
+
15
+ class AdaptiveAugment:
16
+ def __init__(self, ada_aug_target, ada_aug_len, update_every, device):
17
+ self.ada_aug_target = ada_aug_target
18
+ self.ada_aug_len = ada_aug_len
19
+ self.update_every = update_every
20
+
21
+ self.ada_update = 0
22
+ self.ada_aug_buf = torch.tensor([0.0, 0.0], device=device)
23
+ self.r_t_stat = 0
24
+ self.ada_aug_p = 0
25
+
26
+ @torch.no_grad()
27
+ def tune(self, real_pred):
28
+ self.ada_aug_buf += torch.tensor(
29
+ (torch.sign(real_pred).sum().item(), real_pred.shape[0]),
30
+ device=real_pred.device,
31
+ )
32
+ self.ada_update += 1
33
+
34
+ if self.ada_update % self.update_every == 0:
35
+ self.ada_aug_buf = reduce_sum(self.ada_aug_buf)
36
+ pred_signs, n_pred = self.ada_aug_buf.tolist()
37
+
38
+ self.r_t_stat = pred_signs / n_pred
39
+
40
+ if self.r_t_stat > self.ada_aug_target:
41
+ sign = 1
42
+
43
+ else:
44
+ sign = -1
45
+
46
+ self.ada_aug_p += sign * n_pred / self.ada_aug_len
47
+ self.ada_aug_p = min(1, max(0, self.ada_aug_p))
48
+ self.ada_aug_buf.mul_(0)
49
+ self.ada_update = 0
50
+
51
+ return self.ada_aug_p
52
+
53
+
54
+ SYM6 = (
55
+ 0.015404109327027373,
56
+ 0.0034907120842174702,
57
+ -0.11799011114819057,
58
+ -0.048311742585633,
59
+ 0.4910559419267466,
60
+ 0.787641141030194,
61
+ 0.3379294217276218,
62
+ -0.07263752278646252,
63
+ -0.021060292512300564,
64
+ 0.04472490177066578,
65
+ 0.0017677118642428036,
66
+ -0.007800708325034148,
67
+ )
68
+
69
+
70
+ def translate_mat(t_x, t_y, device="cpu"):
71
+ batch = t_x.shape[0]
72
+
73
+ mat = torch.eye(3, device=device).unsqueeze(0).repeat(batch, 1, 1)
74
+ translate = torch.stack((t_x, t_y), 1)
75
+ mat[:, :2, 2] = translate
76
+
77
+ return mat
78
+
79
+
80
+ def rotate_mat(theta, device="cpu"):
81
+ batch = theta.shape[0]
82
+
83
+ mat = torch.eye(3, device=device).unsqueeze(0).repeat(batch, 1, 1)
84
+ sin_t = torch.sin(theta)
85
+ cos_t = torch.cos(theta)
86
+ rot = torch.stack((cos_t, -sin_t, sin_t, cos_t), 1).view(batch, 2, 2)
87
+ mat[:, :2, :2] = rot
88
+
89
+ return mat
90
+
91
+
92
+ def scale_mat(s_x, s_y, device="cpu"):
93
+ batch = s_x.shape[0]
94
+
95
+ mat = torch.eye(3, device=device).unsqueeze(0).repeat(batch, 1, 1)
96
+ mat[:, 0, 0] = s_x
97
+ mat[:, 1, 1] = s_y
98
+
99
+ return mat
100
+
101
+
102
+ def translate3d_mat(t_x, t_y, t_z):
103
+ batch = t_x.shape[0]
104
+
105
+ mat = torch.eye(4).unsqueeze(0).repeat(batch, 1, 1)
106
+ translate = torch.stack((t_x, t_y, t_z), 1)
107
+ mat[:, :3, 3] = translate
108
+
109
+ return mat
110
+
111
+
112
+ def rotate3d_mat(axis, theta):
113
+ batch = theta.shape[0]
114
+
115
+ u_x, u_y, u_z = axis
116
+
117
+ eye = torch.eye(3).unsqueeze(0)
118
+ cross = torch.tensor([(0, -u_z, u_y), (u_z, 0, -u_x), (-u_y, u_x, 0)]).unsqueeze(0)
119
+ outer = torch.tensor(axis)
120
+ outer = (outer.unsqueeze(1) * outer).unsqueeze(0)
121
+
122
+ sin_t = torch.sin(theta).view(-1, 1, 1)
123
+ cos_t = torch.cos(theta).view(-1, 1, 1)
124
+
125
+ rot = cos_t * eye + sin_t * cross + (1 - cos_t) * outer
126
+
127
+ eye_4 = torch.eye(4).unsqueeze(0).repeat(batch, 1, 1)
128
+ eye_4[:, :3, :3] = rot
129
+
130
+ return eye_4
131
+
132
+
133
+ def scale3d_mat(s_x, s_y, s_z):
134
+ batch = s_x.shape[0]
135
+
136
+ mat = torch.eye(4).unsqueeze(0).repeat(batch, 1, 1)
137
+ mat[:, 0, 0] = s_x
138
+ mat[:, 1, 1] = s_y
139
+ mat[:, 2, 2] = s_z
140
+
141
+ return mat
142
+
143
+
144
+ def luma_flip_mat(axis, i):
145
+ batch = i.shape[0]
146
+
147
+ eye = torch.eye(4).unsqueeze(0).repeat(batch, 1, 1)
148
+ axis = torch.tensor(axis + (0,))
149
+ flip = 2 * torch.ger(axis, axis) * i.view(-1, 1, 1)
150
+
151
+ return eye - flip
152
+
153
+
154
+ def saturation_mat(axis, i):
155
+ batch = i.shape[0]
156
+
157
+ eye = torch.eye(4).unsqueeze(0).repeat(batch, 1, 1)
158
+ axis = torch.tensor(axis + (0,))
159
+ axis = torch.ger(axis, axis)
160
+ saturate = axis + (eye - axis) * i.view(-1, 1, 1)
161
+
162
+ return saturate
163
+
164
+
165
+ def lognormal_sample(size, mean=0, std=1, device="cpu"):
166
+ return torch.empty(size, device=device).log_normal_(mean=mean, std=std)
167
+
168
+
169
+ def category_sample(size, categories, device="cpu"):
170
+ category = torch.tensor(categories, device=device)
171
+ sample = torch.randint(high=len(categories), size=(size,), device=device)
172
+
173
+ return category[sample]
174
+
175
+
176
+ def uniform_sample(size, low, high, device="cpu"):
177
+ return torch.empty(size, device=device).uniform_(low, high)
178
+
179
+
180
+ def normal_sample(size, mean=0, std=1, device="cpu"):
181
+ return torch.empty(size, device=device).normal_(mean, std)
182
+
183
+
184
+ def bernoulli_sample(size, p, device="cpu"):
185
+ return torch.empty(size, device=device).bernoulli_(p)
186
+
187
+
188
+ def random_mat_apply(p, transform, prev, eye, device="cpu"):
189
+ size = transform.shape[0]
190
+ select = bernoulli_sample(size, p, device=device).view(size, 1, 1)
191
+ select_transform = select * transform + (1 - select) * eye
192
+
193
+ return select_transform @ prev
194
+
195
+
196
+ def sample_affine(p, size, height, width, device="cpu"):
197
+ G = torch.eye(3, device=device).unsqueeze(0).repeat(size, 1, 1)
198
+ eye = G
199
+
200
+ # flip
201
+ param = category_sample(size, (0, 1))
202
+ Gc = scale_mat(1 - 2.0 * param, torch.ones(size), device=device)
203
+ G = random_mat_apply(p, Gc, G, eye, device=device)
204
+ # print('flip', G, scale_mat(1 - 2.0 * param, torch.ones(size)), sep='\n')
205
+
206
+ # 90 rotate
207
+ #param = category_sample(size, (0, 3))
208
+ #Gc = rotate_mat(-math.pi / 2 * param, device=device)
209
+ #G = random_mat_apply(p, Gc, G, eye, device=device)
210
+ # print('90 rotate', G, rotate_mat(-math.pi / 2 * param), sep='\n')
211
+
212
+ # integer translate
213
+ param = uniform_sample(size, -0.125, 0.125)
214
+ param_height = torch.round(param * height) / height
215
+ param_width = torch.round(param * width) / width
216
+ Gc = translate_mat(param_width, param_height, device=device)
217
+ G = random_mat_apply(p, Gc, G, eye, device=device)
218
+ # print('integer translate', G, translate_mat(param_width, param_height), sep='\n')
219
+
220
+ # isotropic scale
221
+ param = lognormal_sample(size, std=0.1 * math.log(2))
222
+ Gc = scale_mat(param, param, device=device)
223
+ G = random_mat_apply(p, Gc, G, eye, device=device)
224
+ # print('isotropic scale', G, scale_mat(param, param), sep='\n')
225
+
226
+ p_rot = 1 - math.sqrt(1 - p)
227
+
228
+ # pre-rotate
229
+ param = uniform_sample(size, -math.pi * 0.25, math.pi * 0.25)
230
+ Gc = rotate_mat(-param, device=device)
231
+ G = random_mat_apply(p_rot, Gc, G, eye, device=device)
232
+ # print('pre-rotate', G, rotate_mat(-param), sep='\n')
233
+
234
+ # anisotropic scale
235
+ param = lognormal_sample(size, std=0.1 * math.log(2))
236
+ Gc = scale_mat(param, 1 / param, device=device)
237
+ G = random_mat_apply(p, Gc, G, eye, device=device)
238
+ # print('anisotropic scale', G, scale_mat(param, 1 / param), sep='\n')
239
+
240
+ # post-rotate
241
+ param = uniform_sample(size, -math.pi * 0.25, math.pi * 0.25)
242
+ Gc = rotate_mat(-param, device=device)
243
+ G = random_mat_apply(p_rot, Gc, G, eye, device=device)
244
+ # print('post-rotate', G, rotate_mat(-param), sep='\n')
245
+
246
+ # fractional translate
247
+ param = normal_sample(size, std=0.125)
248
+ Gc = translate_mat(param, param, device=device)
249
+ G = random_mat_apply(p, Gc, G, eye, device=device)
250
+ # print('fractional translate', G, translate_mat(param, param), sep='\n')
251
+
252
+ return G
253
+
254
+
255
+ def sample_color(p, size):
256
+ C = torch.eye(4).unsqueeze(0).repeat(size, 1, 1)
257
+ eye = C
258
+ axis_val = 1 / math.sqrt(3)
259
+ axis = (axis_val, axis_val, axis_val)
260
+
261
+ # brightness
262
+ param = normal_sample(size, std=0.2)
263
+ Cc = translate3d_mat(param, param, param)
264
+ C = random_mat_apply(p, Cc, C, eye)
265
+
266
+ # contrast
267
+ param = lognormal_sample(size, std=0.5 * math.log(2))
268
+ Cc = scale3d_mat(param, param, param)
269
+ C = random_mat_apply(p, Cc, C, eye)
270
+
271
+ # luma flip
272
+ param = category_sample(size, (0, 1))
273
+ Cc = luma_flip_mat(axis, param)
274
+ C = random_mat_apply(p, Cc, C, eye)
275
+
276
+ # hue rotation
277
+ param = uniform_sample(size, -math.pi, math.pi)
278
+ Cc = rotate3d_mat(axis, param)
279
+ C = random_mat_apply(p, Cc, C, eye)
280
+
281
+ # saturation
282
+ param = lognormal_sample(size, std=1 * math.log(2))
283
+ Cc = saturation_mat(axis, param)
284
+ C = random_mat_apply(p, Cc, C, eye)
285
+
286
+ return C
287
+
288
+
289
+ def make_grid(shape, x0, x1, y0, y1, device):
290
+ n, c, h, w = shape
291
+ grid = torch.empty(n, h, w, 3, device=device)
292
+ grid[:, :, :, 0] = torch.linspace(x0, x1, w, device=device)
293
+ grid[:, :, :, 1] = torch.linspace(y0, y1, h, device=device).unsqueeze(-1)
294
+ grid[:, :, :, 2] = 1
295
+
296
+ return grid
297
+
298
+
299
+ def affine_grid(grid, mat):
300
+ n, h, w, _ = grid.shape
301
+ return (grid.view(n, h * w, 3) @ mat.transpose(1, 2)).view(n, h, w, 2)
302
+
303
+
304
+ def get_padding(G, height, width, kernel_size):
305
+ device = G.device
306
+
307
+ cx = (width - 1) / 2
308
+ cy = (height - 1) / 2
309
+ cp = torch.tensor(
310
+ [(-cx, -cy, 1), (cx, -cy, 1), (cx, cy, 1), (-cx, cy, 1)], device=device
311
+ )
312
+ cp = G @ cp.T
313
+
314
+ pad_k = kernel_size // 4
315
+
316
+ pad = cp[:, :2, :].permute(1, 0, 2).flatten(1)
317
+ pad = torch.cat((-pad, pad)).max(1).values
318
+ pad = pad + torch.tensor([pad_k * 2 - cx, pad_k * 2 - cy] * 2, device=device)
319
+ pad = pad.max(torch.tensor([0, 0] * 2, device=device))
320
+ pad = pad.min(torch.tensor([width - 1, height - 1] * 2, device=device))
321
+
322
+ pad_x1, pad_y1, pad_x2, pad_y2 = pad.ceil().to(torch.int32)
323
+
324
+ return pad_x1, pad_x2, pad_y1, pad_y2
325
+
326
+
327
+ def try_sample_affine_and_pad(img, p, kernel_size, G=None):
328
+ batch, _, height, width = img.shape
329
+
330
+ G_try = G
331
+
332
+ if G is None:
333
+ G_try = torch.inverse(sample_affine(p, batch, height, width))
334
+
335
+ pad_x1, pad_x2, pad_y1, pad_y2 = get_padding(G_try, height, width, kernel_size)
336
+
337
+ img_pad = F.pad(img, (pad_x1, pad_x2, pad_y1, pad_y2), mode="reflect")
338
+
339
+ return img_pad, G_try, (pad_x1, pad_x2, pad_y1, pad_y2)
340
+
341
+
342
+ class GridSampleForward(autograd.Function):
343
+ @staticmethod
344
+ def forward(ctx, input, grid):
345
+ out = F.grid_sample(
346
+ input, grid, mode="bilinear", padding_mode="zeros", align_corners=False
347
+ )
348
+ ctx.save_for_backward(input, grid)
349
+
350
+ return out
351
+
352
+ @staticmethod
353
+ def backward(ctx, grad_output):
354
+ input, grid = ctx.saved_tensors
355
+ grad_input, grad_grid = GridSampleBackward.apply(grad_output, input, grid)
356
+
357
+ return grad_input, grad_grid
358
+
359
+
360
+ class GridSampleBackward(autograd.Function):
361
+ @staticmethod
362
+ def forward(ctx, grad_output, input, grid):
363
+ op = torch._C._jit_get_operation("aten::grid_sampler_2d_backward")
364
+ grad_input, grad_grid = op(grad_output, input, grid, 0, 0, False)
365
+ ctx.save_for_backward(grid)
366
+
367
+ return grad_input, grad_grid
368
+
369
+ @staticmethod
370
+ def backward(ctx, grad_grad_input, grad_grad_grid):
371
+ grid, = ctx.saved_tensors
372
+ grad_grad_output = None
373
+
374
+ if ctx.needs_input_grad[0]:
375
+ grad_grad_output = GridSampleForward.apply(grad_grad_input, grid)
376
+
377
+ return grad_grad_output, None, None
378
+
379
+
380
+ grid_sample = GridSampleForward.apply
381
+
382
+
383
+ def scale_mat_single(s_x, s_y):
384
+ return torch.tensor(((s_x, 0, 0), (0, s_y, 0), (0, 0, 1)), dtype=torch.float32)
385
+
386
+
387
+ def translate_mat_single(t_x, t_y):
388
+ return torch.tensor(((1, 0, t_x), (0, 1, t_y), (0, 0, 1)), dtype=torch.float32)
389
+
390
+
391
+ def random_apply_affine(img, p, G=None, antialiasing_kernel=SYM6):
392
+ kernel = antialiasing_kernel
393
+ len_k = len(kernel)
394
+
395
+ kernel = torch.as_tensor(kernel).to(img)
396
+ # kernel = torch.ger(kernel, kernel).to(img)
397
+ kernel_flip = torch.flip(kernel, (0,))
398
+
399
+ img_pad, G, (pad_x1, pad_x2, pad_y1, pad_y2) = try_sample_affine_and_pad(
400
+ img, p, len_k, G
401
+ )
402
+
403
+ G_inv = (
404
+ translate_mat_single((pad_x1 - pad_x2).item() / 2, (pad_y1 - pad_y2).item() / 2)
405
+ @ G
406
+ )
407
+ up_pad = (
408
+ (len_k + 2 - 1) // 2,
409
+ (len_k - 2) // 2,
410
+ (len_k + 2 - 1) // 2,
411
+ (len_k - 2) // 2,
412
+ )
413
+ img_2x = upfirdn2d(img_pad, kernel.unsqueeze(0), up=(2, 1), pad=(*up_pad[:2], 0, 0))
414
+ img_2x = upfirdn2d(img_2x, kernel.unsqueeze(1), up=(1, 2), pad=(0, 0, *up_pad[2:]))
415
+ G_inv = scale_mat_single(2, 2) @ G_inv @ scale_mat_single(1 / 2, 1 / 2)
416
+ G_inv = translate_mat_single(-0.5, -0.5) @ G_inv @ translate_mat_single(0.5, 0.5)
417
+ batch_size, channel, height, width = img.shape
418
+ pad_k = len_k // 4
419
+ shape = (batch_size, channel, (height + pad_k * 2) * 2, (width + pad_k * 2) * 2)
420
+ G_inv = (
421
+ scale_mat_single(2 / img_2x.shape[3], 2 / img_2x.shape[2])
422
+ @ G_inv
423
+ @ scale_mat_single(1 / (2 / shape[3]), 1 / (2 / shape[2]))
424
+ )
425
+ grid = F.affine_grid(G_inv[:, :2, :].to(img_2x), shape, align_corners=False)
426
+ img_affine = grid_sample(img_2x, grid)
427
+ d_p = -pad_k * 2
428
+ down_pad = (
429
+ d_p + (len_k - 2 + 1) // 2,
430
+ d_p + (len_k - 2) // 2,
431
+ d_p + (len_k - 2 + 1) // 2,
432
+ d_p + (len_k - 2) // 2,
433
+ )
434
+ img_down = upfirdn2d(
435
+ img_affine, kernel_flip.unsqueeze(0), down=(2, 1), pad=(*down_pad[:2], 0, 0)
436
+ )
437
+ img_down = upfirdn2d(
438
+ img_down, kernel_flip.unsqueeze(1), down=(1, 2), pad=(0, 0, *down_pad[2:])
439
+ )
440
+
441
+ return img_down, G
442
+
443
+
444
+ def apply_color(img, mat):
445
+ batch = img.shape[0]
446
+ img = img.permute(0, 2, 3, 1)
447
+ mat_mul = mat[:, :3, :3].transpose(1, 2).view(batch, 1, 3, 3)
448
+ mat_add = mat[:, :3, 3].view(batch, 1, 1, 3)
449
+ img = img @ mat_mul + mat_add
450
+ img = img.permute(0, 3, 1, 2)
451
+
452
+ return img
453
+
454
+
455
+ def random_apply_color(img, p, C=None):
456
+ if C is None:
457
+ C = sample_color(p, img.shape[0])
458
+
459
+ img = apply_color(img, C.to(img))
460
+
461
+ return img, C
462
+
463
+
464
+ def augment(img, p, transform_matrix=(None, None)):
465
+ img, G = random_apply_affine(img, p, transform_matrix[0])
466
+ img, C = random_apply_color(img, p, transform_matrix[1])
467
+
468
+ return img, (G, C)
vtoonify/model/stylegan/__init__.py ADDED
File without changes
vtoonify/model/stylegan/dataset.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from io import BytesIO
2
+
3
+ import lmdb
4
+ from PIL import Image
5
+ from torch.utils.data import Dataset
6
+
7
+
8
+ class MultiResolutionDataset(Dataset):
9
+ def __init__(self, path, transform, resolution=256):
10
+ self.env = lmdb.open(
11
+ path,
12
+ max_readers=32,
13
+ readonly=True,
14
+ lock=False,
15
+ readahead=False,
16
+ meminit=False,
17
+ )
18
+
19
+ if not self.env:
20
+ raise IOError('Cannot open lmdb dataset', path)
21
+
22
+ with self.env.begin(write=False) as txn:
23
+ self.length = int(txn.get('length'.encode('utf-8')).decode('utf-8'))
24
+
25
+ self.resolution = resolution
26
+ self.transform = transform
27
+
28
+ def __len__(self):
29
+ return self.length
30
+
31
+ def __getitem__(self, index):
32
+ with self.env.begin(write=False) as txn:
33
+ key = f'{self.resolution}-{str(index).zfill(5)}'.encode('utf-8')
34
+ img_bytes = txn.get(key)
35
+
36
+ buffer = BytesIO(img_bytes)
37
+ img = Image.open(buffer)
38
+ img = self.transform(img)
39
+
40
+ return img
vtoonify/model/stylegan/distributed.py ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import pickle
3
+
4
+ import torch
5
+ from torch import distributed as dist
6
+ from torch.utils.data.sampler import Sampler
7
+
8
+
9
+ def get_rank():
10
+ if not dist.is_available():
11
+ return 0
12
+
13
+ if not dist.is_initialized():
14
+ return 0
15
+
16
+ return dist.get_rank()
17
+
18
+
19
+ def synchronize():
20
+ if not dist.is_available():
21
+ return
22
+
23
+ if not dist.is_initialized():
24
+ return
25
+
26
+ world_size = dist.get_world_size()
27
+
28
+ if world_size == 1:
29
+ return
30
+
31
+ dist.barrier()
32
+
33
+
34
+ def get_world_size():
35
+ if not dist.is_available():
36
+ return 1
37
+
38
+ if not dist.is_initialized():
39
+ return 1
40
+
41
+ return dist.get_world_size()
42
+
43
+
44
+ def reduce_sum(tensor):
45
+ if not dist.is_available():
46
+ return tensor
47
+
48
+ if not dist.is_initialized():
49
+ return tensor
50
+
51
+ tensor = tensor.clone()
52
+ dist.all_reduce(tensor, op=dist.ReduceOp.SUM)
53
+
54
+ return tensor
55
+
56
+
57
+ def gather_grad(params):
58
+ world_size = get_world_size()
59
+
60
+ if world_size == 1:
61
+ return
62
+
63
+ for param in params:
64
+ if param.grad is not None:
65
+ dist.all_reduce(param.grad.data, op=dist.ReduceOp.SUM)
66
+ param.grad.data.div_(world_size)
67
+
68
+
69
+ def all_gather(data):
70
+ world_size = get_world_size()
71
+
72
+ if world_size == 1:
73
+ return [data]
74
+
75
+ buffer = pickle.dumps(data)
76
+ storage = torch.ByteStorage.from_buffer(buffer)
77
+ tensor = torch.ByteTensor(storage).to('cuda')
78
+
79
+ local_size = torch.IntTensor([tensor.numel()]).to('cuda')
80
+ size_list = [torch.IntTensor([0]).to('cuda') for _ in range(world_size)]
81
+ dist.all_gather(size_list, local_size)
82
+ size_list = [int(size.item()) for size in size_list]
83
+ max_size = max(size_list)
84
+
85
+ tensor_list = []
86
+ for _ in size_list:
87
+ tensor_list.append(torch.ByteTensor(size=(max_size,)).to('cuda'))
88
+
89
+ if local_size != max_size:
90
+ padding = torch.ByteTensor(size=(max_size - local_size,)).to('cuda')
91
+ tensor = torch.cat((tensor, padding), 0)
92
+
93
+ dist.all_gather(tensor_list, tensor)
94
+
95
+ data_list = []
96
+
97
+ for size, tensor in zip(size_list, tensor_list):
98
+ buffer = tensor.cpu().numpy().tobytes()[:size]
99
+ data_list.append(pickle.loads(buffer))
100
+
101
+ return data_list
102
+
103
+
104
+ def reduce_loss_dict(loss_dict):
105
+ world_size = get_world_size()
106
+
107
+ if world_size < 2:
108
+ return loss_dict
109
+
110
+ with torch.no_grad():
111
+ keys = []
112
+ losses = []
113
+
114
+ for k in sorted(loss_dict.keys()):
115
+ keys.append(k)
116
+ losses.append(loss_dict[k])
117
+
118
+ losses = torch.stack(losses, 0)
119
+ dist.reduce(losses, dst=0)
120
+
121
+ if dist.get_rank() == 0:
122
+ losses /= world_size
123
+
124
+ reduced_losses = {k: v for k, v in zip(keys, losses)}
125
+
126
+ return reduced_losses
vtoonify/model/stylegan/lpips/__init__.py ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ from __future__ import absolute_import
3
+ from __future__ import division
4
+ from __future__ import print_function
5
+
6
+ import numpy as np
7
+ #from skimage.measure import compare_ssim
8
+ from skimage.metrics import structural_similarity as compare_ssim
9
+ import torch
10
+ from torch.autograd import Variable
11
+
12
+ from model.stylegan.lpips import dist_model
13
+
14
+ class PerceptualLoss(torch.nn.Module):
15
+ def __init__(self, model='net-lin', net='alex', colorspace='rgb', spatial=False, use_gpu=True, gpu_ids=[0]): # VGG using our perceptually-learned weights (LPIPS metric)
16
+ # def __init__(self, model='net', net='vgg', use_gpu=True): # "default" way of using VGG as a perceptual loss
17
+ super(PerceptualLoss, self).__init__()
18
+ print('Setting up Perceptual loss...')
19
+ self.use_gpu = use_gpu
20
+ self.spatial = spatial
21
+ self.gpu_ids = gpu_ids
22
+ self.model = dist_model.DistModel()
23
+ self.model.initialize(model=model, net=net, use_gpu=use_gpu, colorspace=colorspace, spatial=self.spatial, gpu_ids=gpu_ids)
24
+ print('...[%s] initialized'%self.model.name())
25
+ print('...Done')
26
+
27
+ def forward(self, pred, target, normalize=False):
28
+ """
29
+ Pred and target are Variables.
30
+ If normalize is True, assumes the images are between [0,1] and then scales them between [-1,+1]
31
+ If normalize is False, assumes the images are already between [-1,+1]
32
+
33
+ Inputs pred and target are Nx3xHxW
34
+ Output pytorch Variable N long
35
+ """
36
+
37
+ if normalize:
38
+ target = 2 * target - 1
39
+ pred = 2 * pred - 1
40
+
41
+ return self.model.forward(target, pred)
42
+
43
+ def normalize_tensor(in_feat,eps=1e-10):
44
+ norm_factor = torch.sqrt(torch.sum(in_feat**2,dim=1,keepdim=True))
45
+ return in_feat/(norm_factor+eps)
46
+
47
+ def l2(p0, p1, range=255.):
48
+ return .5*np.mean((p0 / range - p1 / range)**2)
49
+
50
+ def psnr(p0, p1, peak=255.):
51
+ return 10*np.log10(peak**2/np.mean((1.*p0-1.*p1)**2))
52
+
53
+ def dssim(p0, p1, range=255.):
54
+ return (1 - compare_ssim(p0, p1, data_range=range, multichannel=True)) / 2.
55
+
56
+ def rgb2lab(in_img,mean_cent=False):
57
+ from skimage import color
58
+ img_lab = color.rgb2lab(in_img)
59
+ if(mean_cent):
60
+ img_lab[:,:,0] = img_lab[:,:,0]-50
61
+ return img_lab
62
+
63
+ def tensor2np(tensor_obj):
64
+ # change dimension of a tensor object into a numpy array
65
+ return tensor_obj[0].cpu().float().numpy().transpose((1,2,0))
66
+
67
+ def np2tensor(np_obj):
68
+ # change dimenion of np array into tensor array
69
+ return torch.Tensor(np_obj[:, :, :, np.newaxis].transpose((3, 2, 0, 1)))
70
+
71
+ def tensor2tensorlab(image_tensor,to_norm=True,mc_only=False):
72
+ # image tensor to lab tensor
73
+ from skimage import color
74
+
75
+ img = tensor2im(image_tensor)
76
+ img_lab = color.rgb2lab(img)
77
+ if(mc_only):
78
+ img_lab[:,:,0] = img_lab[:,:,0]-50
79
+ if(to_norm and not mc_only):
80
+ img_lab[:,:,0] = img_lab[:,:,0]-50
81
+ img_lab = img_lab/100.
82
+
83
+ return np2tensor(img_lab)
84
+
85
+ def tensorlab2tensor(lab_tensor,return_inbnd=False):
86
+ from skimage import color
87
+ import warnings
88
+ warnings.filterwarnings("ignore")
89
+
90
+ lab = tensor2np(lab_tensor)*100.
91
+ lab[:,:,0] = lab[:,:,0]+50
92
+
93
+ rgb_back = 255.*np.clip(color.lab2rgb(lab.astype('float')),0,1)
94
+ if(return_inbnd):
95
+ # convert back to lab, see if we match
96
+ lab_back = color.rgb2lab(rgb_back.astype('uint8'))
97
+ mask = 1.*np.isclose(lab_back,lab,atol=2.)
98
+ mask = np2tensor(np.prod(mask,axis=2)[:,:,np.newaxis])
99
+ return (im2tensor(rgb_back),mask)
100
+ else:
101
+ return im2tensor(rgb_back)
102
+
103
+ def rgb2lab(input):
104
+ from skimage import color
105
+ return color.rgb2lab(input / 255.)
106
+
107
+ def tensor2im(image_tensor, imtype=np.uint8, cent=1., factor=255./2.):
108
+ image_numpy = image_tensor[0].cpu().float().numpy()
109
+ image_numpy = (np.transpose(image_numpy, (1, 2, 0)) + cent) * factor
110
+ return image_numpy.astype(imtype)
111
+
112
+ def im2tensor(image, imtype=np.uint8, cent=1., factor=255./2.):
113
+ return torch.Tensor((image / factor - cent)
114
+ [:, :, :, np.newaxis].transpose((3, 2, 0, 1)))
115
+
116
+ def tensor2vec(vector_tensor):
117
+ return vector_tensor.data.cpu().numpy()[:, :, 0, 0]
118
+
119
+ def voc_ap(rec, prec, use_07_metric=False):
120
+ """ ap = voc_ap(rec, prec, [use_07_metric])
121
+ Compute VOC AP given precision and recall.
122
+ If use_07_metric is true, uses the
123
+ VOC 07 11 point method (default:False).
124
+ """
125
+ if use_07_metric:
126
+ # 11 point metric
127
+ ap = 0.
128
+ for t in np.arange(0., 1.1, 0.1):
129
+ if np.sum(rec >= t) == 0:
130
+ p = 0
131
+ else:
132
+ p = np.max(prec[rec >= t])
133
+ ap = ap + p / 11.
134
+ else:
135
+ # correct AP calculation
136
+ # first append sentinel values at the end
137
+ mrec = np.concatenate(([0.], rec, [1.]))
138
+ mpre = np.concatenate(([0.], prec, [0.]))
139
+
140
+ # compute the precision envelope
141
+ for i in range(mpre.size - 1, 0, -1):
142
+ mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i])
143
+
144
+ # to calculate area under PR curve, look for points
145
+ # where X axis (recall) changes value
146
+ i = np.where(mrec[1:] != mrec[:-1])[0]
147
+
148
+ # and sum (\Delta recall) * prec
149
+ ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])
150
+ return ap
151
+
152
+ def tensor2im(image_tensor, imtype=np.uint8, cent=1., factor=255./2.):
153
+ # def tensor2im(image_tensor, imtype=np.uint8, cent=1., factor=1.):
154
+ image_numpy = image_tensor[0].cpu().float().numpy()
155
+ image_numpy = (np.transpose(image_numpy, (1, 2, 0)) + cent) * factor
156
+ return image_numpy.astype(imtype)
157
+
158
+ def im2tensor(image, imtype=np.uint8, cent=1., factor=255./2.):
159
+ # def im2tensor(image, imtype=np.uint8, cent=1., factor=1.):
160
+ return torch.Tensor((image / factor - cent)
161
+ [:, :, :, np.newaxis].transpose((3, 2, 0, 1)))