kernpy 0.0.2__py3-none-any.whl → 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. kernpy/__init__.py +215 -0
  2. kernpy/__main__.py +217 -0
  3. kernpy/core/__init__.py +119 -0
  4. kernpy/core/_io.py +48 -0
  5. kernpy/core/base_antlr_importer.py +61 -0
  6. kernpy/core/base_antlr_spine_parser_listener.py +196 -0
  7. kernpy/core/basic_spine_importer.py +43 -0
  8. kernpy/core/document.py +965 -0
  9. kernpy/core/dyn_importer.py +30 -0
  10. kernpy/core/dynam_spine_importer.py +42 -0
  11. kernpy/core/error_listener.py +51 -0
  12. kernpy/core/exporter.py +535 -0
  13. kernpy/core/fing_spine_importer.py +42 -0
  14. kernpy/core/generated/kernSpineLexer.interp +444 -0
  15. kernpy/core/generated/kernSpineLexer.py +535 -0
  16. kernpy/core/generated/kernSpineLexer.tokens +236 -0
  17. kernpy/core/generated/kernSpineParser.interp +425 -0
  18. kernpy/core/generated/kernSpineParser.py +9954 -0
  19. kernpy/core/generated/kernSpineParser.tokens +236 -0
  20. kernpy/core/generated/kernSpineParserListener.py +1200 -0
  21. kernpy/core/generated/kernSpineParserVisitor.py +673 -0
  22. kernpy/core/generic.py +426 -0
  23. kernpy/core/gkern.py +526 -0
  24. kernpy/core/graphviz_exporter.py +89 -0
  25. kernpy/core/harm_spine_importer.py +41 -0
  26. kernpy/core/import_humdrum_old.py +853 -0
  27. kernpy/core/importer.py +285 -0
  28. kernpy/core/importer_factory.py +43 -0
  29. kernpy/core/kern_spine_importer.py +73 -0
  30. kernpy/core/mens_spine_importer.py +23 -0
  31. kernpy/core/mhxm_spine_importer.py +44 -0
  32. kernpy/core/pitch_models.py +338 -0
  33. kernpy/core/root_spine_importer.py +58 -0
  34. kernpy/core/spine_importer.py +45 -0
  35. kernpy/core/text_spine_importer.py +43 -0
  36. kernpy/core/tokenizers.py +239 -0
  37. kernpy/core/tokens.py +2011 -0
  38. kernpy/core/transposer.py +300 -0
  39. kernpy/io/__init__.py +14 -0
  40. kernpy/io/public.py +355 -0
  41. kernpy/polish_scores/__init__.py +13 -0
  42. kernpy/polish_scores/download_polish_dataset.py +357 -0
  43. kernpy/polish_scores/iiif.py +47 -0
  44. kernpy/test_grammar.sh +22 -0
  45. kernpy/util/__init__.py +14 -0
  46. kernpy/util/helpers.py +55 -0
  47. kernpy/util/store_cache.py +35 -0
  48. kernpy/visualize_analysis.sh +23 -0
  49. kernpy-1.0.0.dist-info/METADATA +501 -0
  50. kernpy-1.0.0.dist-info/RECORD +51 -0
  51. {kernpy-0.0.2.dist-info → kernpy-1.0.0.dist-info}/WHEEL +1 -2
  52. kernpy/example.py +0 -1
  53. kernpy-0.0.2.dist-info/LICENSE +0 -19
  54. kernpy-0.0.2.dist-info/METADATA +0 -19
  55. kernpy-0.0.2.dist-info/RECORD +0 -7
  56. kernpy-0.0.2.dist-info/top_level.txt +0 -1
@@ -0,0 +1,42 @@
1
+ from __future__ import annotations
2
+ from typing import Optional
3
+
4
+ from .base_antlr_spine_parser_listener import BaseANTLRSpineParserListener
5
+ from .kern_spine_importer import KernSpineListener, KernSpineImporter
6
+ from .spine_importer import SpineImporter
7
+ from .tokens import Token, SimpleToken, TokenCategory
8
+
9
+
10
+ class FingSpineImporter(SpineImporter):
11
+ def __init__(self, verbose: Optional[bool] = False):
12
+ """
13
+ KernSpineImporter constructor.
14
+
15
+ Args:
16
+ verbose (Optional[bool]): Level of verbosity for error messages.
17
+ """
18
+ super().__init__(verbose=verbose)
19
+
20
+ def import_listener(self) -> BaseANTLRSpineParserListener:
21
+ return KernSpineListener()
22
+
23
+
24
+ def import_token(self, encoding: str) -> Token:
25
+ self._raise_error_if_wrong_input(encoding)
26
+
27
+ kern_spine_importer = KernSpineImporter()
28
+ token = kern_spine_importer.import_token(encoding)
29
+
30
+ ACCEPTED_CATEGORIES = {
31
+ TokenCategory.STRUCTURAL,
32
+ TokenCategory.SIGNATURES,
33
+ TokenCategory.EMPTY,
34
+ TokenCategory.IMAGE_ANNOTATIONS,
35
+ TokenCategory.BARLINES,
36
+ TokenCategory.COMMENTS,
37
+ }
38
+
39
+ if not any(TokenCategory.is_child(child=token.category, parent=cat) for cat in ACCEPTED_CATEGORIES):
40
+ return SimpleToken(encoding, TokenCategory.FINGERING)
41
+
42
+ return token
@@ -0,0 +1,444 @@
1
+ token literal names:
2
+ null
3
+ null
4
+ null
5
+ null
6
+ null
7
+ null
8
+ null
9
+ null
10
+ null
11
+ null
12
+ null
13
+ null
14
+ null
15
+ null
16
+ 'norep'
17
+ null
18
+ null
19
+ null
20
+ null
21
+ null
22
+ null
23
+ null
24
+ null
25
+ null
26
+ null
27
+ null
28
+ null
29
+ null
30
+ null
31
+ null
32
+ null
33
+ null
34
+ null
35
+ null
36
+ null
37
+ null
38
+ null
39
+ null
40
+ null
41
+ null
42
+ '!'
43
+ '%'
44
+ '&'
45
+ '@'
46
+ 'A'
47
+ 'B'
48
+ 'C'
49
+ 'D'
50
+ 'E'
51
+ 'F'
52
+ 'G'
53
+ 'H'
54
+ 'I'
55
+ 'J'
56
+ 'K'
57
+ 'L'
58
+ 'M'
59
+ 'N'
60
+ 'O'
61
+ 'P'
62
+ 'Q'
63
+ 'R'
64
+ 'S'
65
+ 'T'
66
+ 'U'
67
+ 'V'
68
+ 'W'
69
+ 'X'
70
+ 'Y'
71
+ 'Z'
72
+ 'a'
73
+ 'b'
74
+ 'c'
75
+ 'd'
76
+ 'e'
77
+ 'f'
78
+ 'g'
79
+ 'h'
80
+ 'i'
81
+ 'j'
82
+ 'k'
83
+ 'l'
84
+ 'm'
85
+ 'n'
86
+ 'o'
87
+ 'p'
88
+ 'q'
89
+ 'r'
90
+ 's'
91
+ 't'
92
+ 'u'
93
+ 'v'
94
+ 'w'
95
+ 'x'
96
+ 'y'
97
+ 'z'
98
+ null
99
+ '0'
100
+ '1'
101
+ '2'
102
+ '3'
103
+ '4'
104
+ '5'
105
+ '6'
106
+ '7'
107
+ '8'
108
+ '9'
109
+ null
110
+ null
111
+ null
112
+ null
113
+ null
114
+ '"'
115
+ '\''
116
+ '['
117
+ ']'
118
+ '{'
119
+ '}'
120
+ '#'
121
+ '+'
122
+ '-'
123
+ '='
124
+ '.'
125
+ '|'
126
+ '`'
127
+ '^'
128
+ '~'
129
+ '<'
130
+ '>'
131
+ '/'
132
+ '\\'
133
+ '_'
134
+ '$'
135
+ '('
136
+ ')'
137
+ ':'
138
+ ';'
139
+ ','
140
+ '?'
141
+ ' '
142
+ null
143
+ null
144
+
145
+ token symbolic names:
146
+ null
147
+ TANDEM_KEYCANCEL
148
+ TANDEM_PART
149
+ TANDEM_GROUP
150
+ TANDEM_ACCOMP
151
+ TANDEM_SOLO
152
+ TANDEM_STROPHE
153
+ TANDEM_STAFF
154
+ TANDEM_TRANSPOSITION
155
+ TANDEM_CLEF
156
+ TANDEM_KEY_SIGNATURE
157
+ TANDEM_MET
158
+ METRONOME
159
+ TANDEM_SECTION
160
+ NO_REPEAT
161
+ TANDEM_LEFT_HAND
162
+ TANDEM_RIGHT_HAND
163
+ TANDEM_ABOVE
164
+ TANDEM_BELOW
165
+ TANDEM_CENTERED
166
+ TANDEM_PEDAL_START
167
+ TANDEM_ELA
168
+ TANDEM_PEDAL_END
169
+ TANDEM_TUPLET_START
170
+ TANDEM_TUPLET_END
171
+ TANDEM_CUE_START
172
+ TANDEM_CUE_END
173
+ TANDEM_TREMOLO_START
174
+ TANDEM_TREMOLO_END
175
+ TANDEM_TSTART
176
+ TANDEM_TEND
177
+ TANDEM_RSCALE
178
+ TANDEM_TIMESIGNATURE
179
+ TANDEM_SIC
180
+ TANDEM_OSSIA
181
+ TANDEM_FIN
182
+ TANDEM_SMINUS
183
+ TANDEM_TIMEBASE
184
+ TANDEM_BOUNDING_BOX
185
+ OCTAVE_SHIFT
186
+ EXCLAMATION
187
+ PERCENT
188
+ AMPERSAND
189
+ AT
190
+ CHAR_A
191
+ CHAR_B
192
+ CHAR_C
193
+ CHAR_D
194
+ CHAR_E
195
+ CHAR_F
196
+ CHAR_G
197
+ CHAR_H
198
+ CHAR_I
199
+ CHAR_J
200
+ CHAR_K
201
+ CHAR_L
202
+ CHAR_M
203
+ CHAR_N
204
+ CHAR_O
205
+ CHAR_P
206
+ CHAR_Q
207
+ CHAR_R
208
+ CHAR_S
209
+ CHAR_T
210
+ CHAR_U
211
+ CHAR_V
212
+ CHAR_W
213
+ CHAR_X
214
+ CHAR_Y
215
+ CHAR_Z
216
+ CHAR_a
217
+ CHAR_b
218
+ CHAR_c
219
+ CHAR_d
220
+ CHAR_e
221
+ CHAR_f
222
+ CHAR_g
223
+ CHAR_h
224
+ CHAR_i
225
+ CHAR_j
226
+ CHAR_k
227
+ CHAR_l
228
+ CHAR_m
229
+ CHAR_n
230
+ CHAR_o
231
+ CHAR_p
232
+ CHAR_q
233
+ CHAR_r
234
+ CHAR_s
235
+ CHAR_t
236
+ CHAR_u
237
+ CHAR_v
238
+ CHAR_w
239
+ CHAR_x
240
+ CHAR_y
241
+ CHAR_z
242
+ NON_ENGLISH
243
+ DIGIT_0
244
+ DIGIT_1
245
+ DIGIT_2
246
+ DIGIT_3
247
+ DIGIT_4
248
+ DIGIT_5
249
+ DIGIT_6
250
+ DIGIT_7
251
+ DIGIT_8
252
+ DIGIT_9
253
+ SPINE_TERMINATOR
254
+ SPINE_ADD
255
+ SPINE_SPLIT
256
+ SPINE_JOIN
257
+ ASTERISK
258
+ QUOTATION_MARK
259
+ APOSTROPHE
260
+ LEFT_BRACKET
261
+ RIGHT_BRACKET
262
+ LEFT_CURLY_BRACES
263
+ RIGHT_CURLY_BRACES
264
+ OCTOTHORPE
265
+ PLUS
266
+ MINUS
267
+ EQUAL
268
+ DOT
269
+ PIPE
270
+ GRAVE_ACCENT
271
+ CIRCUMFLEX
272
+ TILDE
273
+ ANGLE_BRACKET_OPEN
274
+ ANGLE_BRACKET_CLOSE
275
+ SLASH
276
+ BACKSLASH
277
+ UNDERSCORE
278
+ DOLLAR
279
+ LEFT_PARENTHESIS
280
+ RIGHT_PARENTHESIS
281
+ COLON
282
+ SEMICOLON
283
+ COMMA
284
+ QUESTION_MARK
285
+ SPACE
286
+ INSTRUMENT_TITLE
287
+ INSTRUMENT
288
+
289
+ rule names:
290
+ ASTERISK_FRAGMENT
291
+ TANDEM_KEYCANCEL
292
+ TANDEM_PART
293
+ TANDEM_GROUP
294
+ TANDEM_ACCOMP
295
+ TANDEM_SOLO
296
+ TANDEM_STROPHE
297
+ TANDEM_STAFF
298
+ TANDEM_TRANSPOSITION
299
+ TANDEM_CLEF
300
+ TANDEM_KEY_SIGNATURE
301
+ TANDEM_MET
302
+ METRONOME
303
+ TANDEM_SECTION
304
+ NO_REPEAT
305
+ TANDEM_LEFT_HAND
306
+ TANDEM_RIGHT_HAND
307
+ TANDEM_ABOVE
308
+ TANDEM_BELOW
309
+ TANDEM_CENTERED
310
+ TANDEM_PEDAL_START
311
+ TANDEM_ELA
312
+ TANDEM_PEDAL_END
313
+ TANDEM_TUPLET_START
314
+ TANDEM_TUPLET_END
315
+ TANDEM_CUE_START
316
+ TANDEM_CUE_END
317
+ TANDEM_TREMOLO_START
318
+ TANDEM_TREMOLO_END
319
+ TANDEM_TSTART
320
+ TANDEM_TEND
321
+ TANDEM_RSCALE
322
+ TANDEM_TIMESIGNATURE
323
+ TANDEM_SIC
324
+ TANDEM_OSSIA
325
+ TANDEM_FIN
326
+ TANDEM_SMINUS
327
+ TANDEM_TIMEBASE
328
+ TANDEM_BOUNDING_BOX
329
+ OCTAVE_SHIFT
330
+ EXCLAMATION
331
+ PERCENT
332
+ AMPERSAND
333
+ AT
334
+ CHAR_A
335
+ CHAR_B
336
+ CHAR_C
337
+ CHAR_D
338
+ CHAR_E
339
+ CHAR_F
340
+ CHAR_G
341
+ CHAR_H
342
+ CHAR_I
343
+ CHAR_J
344
+ CHAR_K
345
+ CHAR_L
346
+ CHAR_M
347
+ CHAR_N
348
+ CHAR_O
349
+ CHAR_P
350
+ CHAR_Q
351
+ CHAR_R
352
+ CHAR_S
353
+ CHAR_T
354
+ CHAR_U
355
+ CHAR_V
356
+ CHAR_W
357
+ CHAR_X
358
+ CHAR_Y
359
+ CHAR_Z
360
+ CHAR_a
361
+ CHAR_b
362
+ CHAR_c
363
+ CHAR_d
364
+ CHAR_e
365
+ CHAR_f
366
+ CHAR_g
367
+ CHAR_h
368
+ CHAR_i
369
+ CHAR_j
370
+ CHAR_k
371
+ CHAR_l
372
+ CHAR_m
373
+ CHAR_n
374
+ CHAR_o
375
+ CHAR_p
376
+ CHAR_q
377
+ CHAR_r
378
+ CHAR_s
379
+ CHAR_t
380
+ CHAR_u
381
+ CHAR_v
382
+ CHAR_w
383
+ CHAR_x
384
+ CHAR_y
385
+ CHAR_z
386
+ NON_ENGLISH
387
+ DIGIT_0
388
+ DIGIT_1
389
+ DIGIT_2
390
+ DIGIT_3
391
+ DIGIT_4
392
+ DIGIT_5
393
+ DIGIT_6
394
+ DIGIT_7
395
+ DIGIT_8
396
+ DIGIT_9
397
+ SPINE_TERMINATOR
398
+ SPINE_ADD
399
+ SPINE_SPLIT
400
+ SPINE_JOIN
401
+ ASTERISK
402
+ QUOTATION_MARK
403
+ APOSTROPHE
404
+ LEFT_BRACKET
405
+ RIGHT_BRACKET
406
+ LEFT_CURLY_BRACES
407
+ RIGHT_CURLY_BRACES
408
+ OCTOTHORPE
409
+ PLUS
410
+ MINUS
411
+ EQUAL
412
+ DOT
413
+ PIPE
414
+ GRAVE_ACCENT
415
+ CIRCUMFLEX
416
+ TILDE
417
+ ANGLE_BRACKET_OPEN
418
+ ANGLE_BRACKET_CLOSE
419
+ SLASH
420
+ BACKSLASH
421
+ UNDERSCORE
422
+ DOLLAR
423
+ LEFT_PARENTHESIS
424
+ RIGHT_PARENTHESIS
425
+ COLON
426
+ SEMICOLON
427
+ COMMA
428
+ QUESTION_MARK
429
+ SPACE
430
+ INSTRUMENT_TITLE
431
+ INSTRUMENT
432
+ RAW_TEXT
433
+ RAW_TEXT_UNTIL_EOL
434
+ RAW_TEXT_NOT_BARLINE
435
+
436
+ channel names:
437
+ DEFAULT_TOKEN_CHANNEL
438
+ HIDDEN
439
+
440
+ mode names:
441
+ DEFAULT_MODE
442
+
443
+ atn:
444
+ [4, 0, 141, 795, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 3, 8, 348, 8, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 403, 8, 18, 1, 18, 3, 18, 406, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 424, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 3, 39, 548, 8, 39, 1, 39, 1, 39, 4, 39, 552, 8, 39, 11, 39, 12, 39, 553, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 3, 140, 767, 8, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 3, 141, 775, 8, 141, 1, 141, 1, 141, 1, 142, 4, 142, 780, 8, 142, 11, 142, 12, 142, 781, 1, 143, 4, 143, 785, 8, 143, 11, 143, 12, 143, 786, 1, 144, 1, 144, 5, 144, 791, 8, 144, 10, 144, 12, 144, 794, 9, 144, 0, 0, 145, 1, 0, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 112, 227, 113, 229, 114, 231, 115, 233, 116, 235, 117, 237, 118, 239, 119, 241, 120, 243, 121, 245, 122, 247, 123, 249, 124, 251, 125, 253, 126, 255, 127, 257, 128, 259, 129, 261, 130, 263, 131, 265, 132, 267, 133, 269, 134, 271, 135, 273, 136, 275, 137, 277, 138, 279, 139, 281, 140, 283, 141, 285, 0, 287, 0, 289, 0, 1, 0, 6, 1, 0, 48, 57, 2, 0, 98, 98, 118, 118, 10, 0, 192, 193, 199, 201, 204, 205, 209, 211, 217, 218, 224, 225, 231, 233, 236, 237, 241, 243, 249, 250, 2, 0, 9, 10, 13, 13, 2, 0, 10, 10, 13, 13, 6, 0, 9, 10, 13, 13, 33, 33, 58, 59, 61, 61, 124, 124, 801, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 1, 291, 1, 0, 0, 0, 3, 293, 1, 0, 0, 0, 5, 302, 1, 0, 0, 0, 7, 308, 1, 0, 0, 0, 9, 315, 1, 0, 0, 0, 11, 323, 1, 0, 0, 0, 13, 329, 1, 0, 0, 0, 15, 338, 1, 0, 0, 0, 17, 345, 1, 0, 0, 0, 19, 352, 1, 0, 0, 0, 21, 358, 1, 0, 0, 0, 23, 361, 1, 0, 0, 0, 25, 366, 1, 0, 0, 0, 27, 370, 1, 0, 0, 0, 29, 373, 1, 0, 0, 0, 31, 379, 1, 0, 0, 0, 33, 383, 1, 0, 0, 0, 35, 387, 1, 0, 0, 0, 37, 394, 1, 0, 0, 0, 39, 407, 1, 0, 0, 0, 41, 417, 1, 0, 0, 0, 43, 425, 1, 0, 0, 0, 45, 430, 1, 0, 0, 0, 47, 436, 1, 0, 0, 0, 49, 444, 1, 0, 0, 0, 51, 453, 1, 0, 0, 0, 53, 458, 1, 0, 0, 0, 55, 464, 1, 0, 0, 0, 57, 473, 1, 0, 0, 0, 59, 483, 1, 0, 0, 0, 61, 491, 1, 0, 0, 0, 63, 497, 1, 0, 0, 0, 65, 505, 1, 0, 0, 0, 67, 508, 1, 0, 0, 0, 69, 515, 1, 0, 0, 0, 71, 524, 1, 0, 0, 0, 73, 531, 1, 0, 0, 0, 75, 535, 1, 0, 0, 0, 77, 539, 1, 0, 0, 0, 79, 545, 1, 0, 0, 0, 81, 557, 1, 0, 0, 0, 83, 559, 1, 0, 0, 0, 85, 561, 1, 0, 0, 0, 87, 563, 1, 0, 0, 0, 89, 565, 1, 0, 0, 0, 91, 567, 1, 0, 0, 0, 93, 569, 1, 0, 0, 0, 95, 571, 1, 0, 0, 0, 97, 573, 1, 0, 0, 0, 99, 575, 1, 0, 0, 0, 101, 577, 1, 0, 0, 0, 103, 579, 1, 0, 0, 0, 105, 581, 1, 0, 0, 0, 107, 583, 1, 0, 0, 0, 109, 585, 1, 0, 0, 0, 111, 587, 1, 0, 0, 0, 113, 589, 1, 0, 0, 0, 115, 591, 1, 0, 0, 0, 117, 593, 1, 0, 0, 0, 119, 595, 1, 0, 0, 0, 121, 597, 1, 0, 0, 0, 123, 599, 1, 0, 0, 0, 125, 601, 1, 0, 0, 0, 127, 603, 1, 0, 0, 0, 129, 605, 1, 0, 0, 0, 131, 607, 1, 0, 0, 0, 133, 609, 1, 0, 0, 0, 135, 611, 1, 0, 0, 0, 137, 613, 1, 0, 0, 0, 139, 615, 1, 0, 0, 0, 141, 617, 1, 0, 0, 0, 143, 619, 1, 0, 0, 0, 145, 621, 1, 0, 0, 0, 147, 623, 1, 0, 0, 0, 149, 625, 1, 0, 0, 0, 151, 627, 1, 0, 0, 0, 153, 629, 1, 0, 0, 0, 155, 631, 1, 0, 0, 0, 157, 633, 1, 0, 0, 0, 159, 635, 1, 0, 0, 0, 161, 637, 1, 0, 0, 0, 163, 639, 1, 0, 0, 0, 165, 641, 1, 0, 0, 0, 167, 643, 1, 0, 0, 0, 169, 645, 1, 0, 0, 0, 171, 647, 1, 0, 0, 0, 173, 649, 1, 0, 0, 0, 175, 651, 1, 0, 0, 0, 177, 653, 1, 0, 0, 0, 179, 655, 1, 0, 0, 0, 181, 657, 1, 0, 0, 0, 183, 659, 1, 0, 0, 0, 185, 661, 1, 0, 0, 0, 187, 663, 1, 0, 0, 0, 189, 665, 1, 0, 0, 0, 191, 667, 1, 0, 0, 0, 193, 669, 1, 0, 0, 0, 195, 671, 1, 0, 0, 0, 197, 673, 1, 0, 0, 0, 199, 675, 1, 0, 0, 0, 201, 677, 1, 0, 0, 0, 203, 679, 1, 0, 0, 0, 205, 681, 1, 0, 0, 0, 207, 683, 1, 0, 0, 0, 209, 685, 1, 0, 0, 0, 211, 687, 1, 0, 0, 0, 213, 689, 1, 0, 0, 0, 215, 691, 1, 0, 0, 0, 217, 694, 1, 0, 0, 0, 219, 697, 1, 0, 0, 0, 221, 700, 1, 0, 0, 0, 223, 703, 1, 0, 0, 0, 225, 705, 1, 0, 0, 0, 227, 707, 1, 0, 0, 0, 229, 709, 1, 0, 0, 0, 231, 711, 1, 0, 0, 0, 233, 713, 1, 0, 0, 0, 235, 715, 1, 0, 0, 0, 237, 717, 1, 0, 0, 0, 239, 719, 1, 0, 0, 0, 241, 721, 1, 0, 0, 0, 243, 723, 1, 0, 0, 0, 245, 725, 1, 0, 0, 0, 247, 727, 1, 0, 0, 0, 249, 729, 1, 0, 0, 0, 251, 731, 1, 0, 0, 0, 253, 733, 1, 0, 0, 0, 255, 735, 1, 0, 0, 0, 257, 737, 1, 0, 0, 0, 259, 739, 1, 0, 0, 0, 261, 741, 1, 0, 0, 0, 263, 743, 1, 0, 0, 0, 265, 745, 1, 0, 0, 0, 267, 747, 1, 0, 0, 0, 269, 749, 1, 0, 0, 0, 271, 751, 1, 0, 0, 0, 273, 753, 1, 0, 0, 0, 275, 755, 1, 0, 0, 0, 277, 757, 1, 0, 0, 0, 279, 759, 1, 0, 0, 0, 281, 761, 1, 0, 0, 0, 283, 770, 1, 0, 0, 0, 285, 779, 1, 0, 0, 0, 287, 784, 1, 0, 0, 0, 289, 788, 1, 0, 0, 0, 291, 292, 5, 42, 0, 0, 292, 2, 1, 0, 0, 0, 293, 294, 3, 1, 0, 0, 294, 295, 5, 107, 0, 0, 295, 296, 5, 99, 0, 0, 296, 297, 5, 97, 0, 0, 297, 298, 5, 110, 0, 0, 298, 299, 5, 99, 0, 0, 299, 300, 5, 101, 0, 0, 300, 301, 5, 108, 0, 0, 301, 4, 1, 0, 0, 0, 302, 303, 3, 1, 0, 0, 303, 304, 5, 112, 0, 0, 304, 305, 5, 97, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 116, 0, 0, 307, 6, 1, 0, 0, 0, 308, 309, 3, 1, 0, 0, 309, 310, 5, 103, 0, 0, 310, 311, 5, 114, 0, 0, 311, 312, 5, 111, 0, 0, 312, 313, 5, 117, 0, 0, 313, 314, 5, 112, 0, 0, 314, 8, 1, 0, 0, 0, 315, 316, 3, 1, 0, 0, 316, 317, 5, 97, 0, 0, 317, 318, 5, 99, 0, 0, 318, 319, 5, 99, 0, 0, 319, 320, 5, 111, 0, 0, 320, 321, 5, 109, 0, 0, 321, 322, 5, 112, 0, 0, 322, 10, 1, 0, 0, 0, 323, 324, 3, 1, 0, 0, 324, 325, 5, 115, 0, 0, 325, 326, 5, 111, 0, 0, 326, 327, 5, 108, 0, 0, 327, 328, 5, 111, 0, 0, 328, 12, 1, 0, 0, 0, 329, 330, 3, 1, 0, 0, 330, 331, 5, 115, 0, 0, 331, 332, 5, 116, 0, 0, 332, 333, 5, 114, 0, 0, 333, 334, 5, 111, 0, 0, 334, 335, 5, 112, 0, 0, 335, 336, 5, 104, 0, 0, 336, 337, 5, 101, 0, 0, 337, 14, 1, 0, 0, 0, 338, 339, 3, 1, 0, 0, 339, 340, 5, 115, 0, 0, 340, 341, 5, 116, 0, 0, 341, 342, 5, 97, 0, 0, 342, 343, 5, 102, 0, 0, 343, 344, 5, 102, 0, 0, 344, 16, 1, 0, 0, 0, 345, 347, 3, 1, 0, 0, 346, 348, 3, 105, 52, 0, 347, 346, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 5, 84, 0, 0, 350, 351, 5, 114, 0, 0, 351, 18, 1, 0, 0, 0, 352, 353, 3, 1, 0, 0, 353, 354, 5, 99, 0, 0, 354, 355, 5, 108, 0, 0, 355, 356, 5, 101, 0, 0, 356, 357, 5, 102, 0, 0, 357, 20, 1, 0, 0, 0, 358, 359, 3, 1, 0, 0, 359, 360, 5, 107, 0, 0, 360, 22, 1, 0, 0, 0, 361, 362, 3, 1, 0, 0, 362, 363, 5, 109, 0, 0, 363, 364, 5, 101, 0, 0, 364, 365, 5, 116, 0, 0, 365, 24, 1, 0, 0, 0, 366, 367, 3, 1, 0, 0, 367, 368, 5, 77, 0, 0, 368, 369, 5, 77, 0, 0, 369, 26, 1, 0, 0, 0, 370, 371, 3, 1, 0, 0, 371, 372, 5, 62, 0, 0, 372, 28, 1, 0, 0, 0, 373, 374, 5, 110, 0, 0, 374, 375, 5, 111, 0, 0, 375, 376, 5, 114, 0, 0, 376, 377, 5, 101, 0, 0, 377, 378, 5, 112, 0, 0, 378, 30, 1, 0, 0, 0, 379, 380, 3, 1, 0, 0, 380, 381, 5, 108, 0, 0, 381, 382, 5, 104, 0, 0, 382, 32, 1, 0, 0, 0, 383, 384, 3, 1, 0, 0, 384, 385, 5, 114, 0, 0, 385, 386, 5, 104, 0, 0, 386, 34, 1, 0, 0, 0, 387, 388, 3, 1, 0, 0, 388, 389, 5, 97, 0, 0, 389, 390, 5, 98, 0, 0, 390, 391, 5, 111, 0, 0, 391, 392, 5, 118, 0, 0, 392, 393, 5, 101, 0, 0, 393, 36, 1, 0, 0, 0, 394, 395, 3, 1, 0, 0, 395, 396, 5, 98, 0, 0, 396, 397, 5, 101, 0, 0, 397, 398, 5, 108, 0, 0, 398, 399, 5, 111, 0, 0, 399, 400, 5, 119, 0, 0, 400, 405, 1, 0, 0, 0, 401, 403, 3, 271, 135, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 406, 7, 0, 0, 0, 405, 402, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 38, 1, 0, 0, 0, 407, 408, 3, 1, 0, 0, 408, 409, 5, 99, 0, 0, 409, 410, 5, 101, 0, 0, 410, 411, 5, 110, 0, 0, 411, 412, 5, 116, 0, 0, 412, 413, 5, 101, 0, 0, 413, 414, 5, 114, 0, 0, 414, 415, 5, 101, 0, 0, 415, 416, 5, 100, 0, 0, 416, 40, 1, 0, 0, 0, 417, 418, 3, 1, 0, 0, 418, 419, 5, 112, 0, 0, 419, 420, 5, 101, 0, 0, 420, 421, 5, 100, 0, 0, 421, 423, 1, 0, 0, 0, 422, 424, 3, 1, 0, 0, 423, 422, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 42, 1, 0, 0, 0, 425, 426, 3, 1, 0, 0, 426, 427, 5, 101, 0, 0, 427, 428, 5, 108, 0, 0, 428, 429, 5, 97, 0, 0, 429, 44, 1, 0, 0, 0, 430, 431, 3, 1, 0, 0, 431, 432, 5, 88, 0, 0, 432, 433, 5, 112, 0, 0, 433, 434, 5, 101, 0, 0, 434, 435, 5, 100, 0, 0, 435, 46, 1, 0, 0, 0, 436, 437, 3, 1, 0, 0, 437, 438, 5, 116, 0, 0, 438, 439, 5, 117, 0, 0, 439, 440, 5, 112, 0, 0, 440, 441, 5, 108, 0, 0, 441, 442, 5, 101, 0, 0, 442, 443, 5, 116, 0, 0, 443, 48, 1, 0, 0, 0, 444, 445, 3, 1, 0, 0, 445, 446, 5, 88, 0, 0, 446, 447, 5, 116, 0, 0, 447, 448, 5, 117, 0, 0, 448, 449, 5, 112, 0, 0, 449, 450, 5, 108, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 116, 0, 0, 452, 50, 1, 0, 0, 0, 453, 454, 3, 1, 0, 0, 454, 455, 5, 99, 0, 0, 455, 456, 5, 117, 0, 0, 456, 457, 5, 101, 0, 0, 457, 52, 1, 0, 0, 0, 458, 459, 3, 1, 0, 0, 459, 460, 5, 88, 0, 0, 460, 461, 5, 99, 0, 0, 461, 462, 5, 117, 0, 0, 462, 463, 5, 101, 0, 0, 463, 54, 1, 0, 0, 0, 464, 465, 3, 1, 0, 0, 465, 466, 5, 116, 0, 0, 466, 467, 5, 114, 0, 0, 467, 468, 5, 101, 0, 0, 468, 469, 5, 109, 0, 0, 469, 470, 5, 111, 0, 0, 470, 471, 5, 108, 0, 0, 471, 472, 5, 111, 0, 0, 472, 56, 1, 0, 0, 0, 473, 474, 3, 1, 0, 0, 474, 475, 5, 88, 0, 0, 475, 476, 5, 116, 0, 0, 476, 477, 5, 114, 0, 0, 477, 478, 5, 101, 0, 0, 478, 479, 5, 109, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 108, 0, 0, 481, 482, 5, 111, 0, 0, 482, 58, 1, 0, 0, 0, 483, 484, 3, 1, 0, 0, 484, 485, 5, 116, 0, 0, 485, 486, 5, 115, 0, 0, 486, 487, 5, 116, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 114, 0, 0, 489, 490, 5, 116, 0, 0, 490, 60, 1, 0, 0, 0, 491, 492, 3, 1, 0, 0, 492, 493, 5, 116, 0, 0, 493, 494, 5, 101, 0, 0, 494, 495, 5, 110, 0, 0, 495, 496, 5, 100, 0, 0, 496, 62, 1, 0, 0, 0, 497, 498, 3, 1, 0, 0, 498, 499, 5, 114, 0, 0, 499, 500, 5, 115, 0, 0, 500, 501, 5, 99, 0, 0, 501, 502, 5, 97, 0, 0, 502, 503, 5, 108, 0, 0, 503, 504, 5, 101, 0, 0, 504, 64, 1, 0, 0, 0, 505, 506, 3, 1, 0, 0, 506, 507, 5, 77, 0, 0, 507, 66, 1, 0, 0, 0, 508, 509, 3, 1, 0, 0, 509, 510, 5, 83, 0, 0, 510, 511, 5, 47, 0, 0, 511, 512, 5, 115, 0, 0, 512, 513, 5, 105, 0, 0, 513, 514, 5, 99, 0, 0, 514, 68, 1, 0, 0, 0, 515, 516, 3, 1, 0, 0, 516, 517, 5, 83, 0, 0, 517, 518, 5, 47, 0, 0, 518, 519, 5, 111, 0, 0, 519, 520, 5, 115, 0, 0, 520, 521, 5, 115, 0, 0, 521, 522, 5, 105, 0, 0, 522, 523, 5, 97, 0, 0, 523, 70, 1, 0, 0, 0, 524, 525, 3, 1, 0, 0, 525, 526, 5, 83, 0, 0, 526, 527, 5, 47, 0, 0, 527, 528, 5, 102, 0, 0, 528, 529, 5, 105, 0, 0, 529, 530, 5, 110, 0, 0, 530, 72, 1, 0, 0, 0, 531, 532, 3, 1, 0, 0, 532, 533, 5, 83, 0, 0, 533, 534, 5, 45, 0, 0, 534, 74, 1, 0, 0, 0, 535, 536, 3, 1, 0, 0, 536, 537, 5, 116, 0, 0, 537, 538, 5, 98, 0, 0, 538, 76, 1, 0, 0, 0, 539, 540, 3, 1, 0, 0, 540, 541, 5, 120, 0, 0, 541, 542, 5, 121, 0, 0, 542, 543, 5, 119, 0, 0, 543, 544, 5, 104, 0, 0, 544, 78, 1, 0, 0, 0, 545, 547, 3, 1, 0, 0, 546, 548, 5, 88, 0, 0, 547, 546, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 551, 5, 56, 0, 0, 550, 552, 7, 1, 0, 0, 551, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 555, 1, 0, 0, 0, 555, 556, 5, 97, 0, 0, 556, 80, 1, 0, 0, 0, 557, 558, 5, 33, 0, 0, 558, 82, 1, 0, 0, 0, 559, 560, 5, 37, 0, 0, 560, 84, 1, 0, 0, 0, 561, 562, 5, 38, 0, 0, 562, 86, 1, 0, 0, 0, 563, 564, 5, 64, 0, 0, 564, 88, 1, 0, 0, 0, 565, 566, 5, 65, 0, 0, 566, 90, 1, 0, 0, 0, 567, 568, 5, 66, 0, 0, 568, 92, 1, 0, 0, 0, 569, 570, 5, 67, 0, 0, 570, 94, 1, 0, 0, 0, 571, 572, 5, 68, 0, 0, 572, 96, 1, 0, 0, 0, 573, 574, 5, 69, 0, 0, 574, 98, 1, 0, 0, 0, 575, 576, 5, 70, 0, 0, 576, 100, 1, 0, 0, 0, 577, 578, 5, 71, 0, 0, 578, 102, 1, 0, 0, 0, 579, 580, 5, 72, 0, 0, 580, 104, 1, 0, 0, 0, 581, 582, 5, 73, 0, 0, 582, 106, 1, 0, 0, 0, 583, 584, 5, 74, 0, 0, 584, 108, 1, 0, 0, 0, 585, 586, 5, 75, 0, 0, 586, 110, 1, 0, 0, 0, 587, 588, 5, 76, 0, 0, 588, 112, 1, 0, 0, 0, 589, 590, 5, 77, 0, 0, 590, 114, 1, 0, 0, 0, 591, 592, 5, 78, 0, 0, 592, 116, 1, 0, 0, 0, 593, 594, 5, 79, 0, 0, 594, 118, 1, 0, 0, 0, 595, 596, 5, 80, 0, 0, 596, 120, 1, 0, 0, 0, 597, 598, 5, 81, 0, 0, 598, 122, 1, 0, 0, 0, 599, 600, 5, 82, 0, 0, 600, 124, 1, 0, 0, 0, 601, 602, 5, 83, 0, 0, 602, 126, 1, 0, 0, 0, 603, 604, 5, 84, 0, 0, 604, 128, 1, 0, 0, 0, 605, 606, 5, 85, 0, 0, 606, 130, 1, 0, 0, 0, 607, 608, 5, 86, 0, 0, 608, 132, 1, 0, 0, 0, 609, 610, 5, 87, 0, 0, 610, 134, 1, 0, 0, 0, 611, 612, 5, 88, 0, 0, 612, 136, 1, 0, 0, 0, 613, 614, 5, 89, 0, 0, 614, 138, 1, 0, 0, 0, 615, 616, 5, 90, 0, 0, 616, 140, 1, 0, 0, 0, 617, 618, 5, 97, 0, 0, 618, 142, 1, 0, 0, 0, 619, 620, 5, 98, 0, 0, 620, 144, 1, 0, 0, 0, 621, 622, 5, 99, 0, 0, 622, 146, 1, 0, 0, 0, 623, 624, 5, 100, 0, 0, 624, 148, 1, 0, 0, 0, 625, 626, 5, 101, 0, 0, 626, 150, 1, 0, 0, 0, 627, 628, 5, 102, 0, 0, 628, 152, 1, 0, 0, 0, 629, 630, 5, 103, 0, 0, 630, 154, 1, 0, 0, 0, 631, 632, 5, 104, 0, 0, 632, 156, 1, 0, 0, 0, 633, 634, 5, 105, 0, 0, 634, 158, 1, 0, 0, 0, 635, 636, 5, 106, 0, 0, 636, 160, 1, 0, 0, 0, 637, 638, 5, 107, 0, 0, 638, 162, 1, 0, 0, 0, 639, 640, 5, 108, 0, 0, 640, 164, 1, 0, 0, 0, 641, 642, 5, 109, 0, 0, 642, 166, 1, 0, 0, 0, 643, 644, 5, 110, 0, 0, 644, 168, 1, 0, 0, 0, 645, 646, 5, 111, 0, 0, 646, 170, 1, 0, 0, 0, 647, 648, 5, 112, 0, 0, 648, 172, 1, 0, 0, 0, 649, 650, 5, 113, 0, 0, 650, 174, 1, 0, 0, 0, 651, 652, 5, 114, 0, 0, 652, 176, 1, 0, 0, 0, 653, 654, 5, 115, 0, 0, 654, 178, 1, 0, 0, 0, 655, 656, 5, 116, 0, 0, 656, 180, 1, 0, 0, 0, 657, 658, 5, 117, 0, 0, 658, 182, 1, 0, 0, 0, 659, 660, 5, 118, 0, 0, 660, 184, 1, 0, 0, 0, 661, 662, 5, 119, 0, 0, 662, 186, 1, 0, 0, 0, 663, 664, 5, 120, 0, 0, 664, 188, 1, 0, 0, 0, 665, 666, 5, 121, 0, 0, 666, 190, 1, 0, 0, 0, 667, 668, 5, 122, 0, 0, 668, 192, 1, 0, 0, 0, 669, 670, 7, 2, 0, 0, 670, 194, 1, 0, 0, 0, 671, 672, 5, 48, 0, 0, 672, 196, 1, 0, 0, 0, 673, 674, 5, 49, 0, 0, 674, 198, 1, 0, 0, 0, 675, 676, 5, 50, 0, 0, 676, 200, 1, 0, 0, 0, 677, 678, 5, 51, 0, 0, 678, 202, 1, 0, 0, 0, 679, 680, 5, 52, 0, 0, 680, 204, 1, 0, 0, 0, 681, 682, 5, 53, 0, 0, 682, 206, 1, 0, 0, 0, 683, 684, 5, 54, 0, 0, 684, 208, 1, 0, 0, 0, 685, 686, 5, 55, 0, 0, 686, 210, 1, 0, 0, 0, 687, 688, 5, 56, 0, 0, 688, 212, 1, 0, 0, 0, 689, 690, 5, 57, 0, 0, 690, 214, 1, 0, 0, 0, 691, 692, 3, 1, 0, 0, 692, 693, 3, 241, 120, 0, 693, 216, 1, 0, 0, 0, 694, 695, 3, 1, 0, 0, 695, 696, 3, 239, 119, 0, 696, 218, 1, 0, 0, 0, 697, 698, 3, 1, 0, 0, 698, 699, 3, 251, 125, 0, 699, 220, 1, 0, 0, 0, 700, 701, 3, 1, 0, 0, 701, 702, 3, 183, 91, 0, 702, 222, 1, 0, 0, 0, 703, 704, 3, 1, 0, 0, 704, 224, 1, 0, 0, 0, 705, 706, 5, 34, 0, 0, 706, 226, 1, 0, 0, 0, 707, 708, 5, 39, 0, 0, 708, 228, 1, 0, 0, 0, 709, 710, 5, 91, 0, 0, 710, 230, 1, 0, 0, 0, 711, 712, 5, 93, 0, 0, 712, 232, 1, 0, 0, 0, 713, 714, 5, 123, 0, 0, 714, 234, 1, 0, 0, 0, 715, 716, 5, 125, 0, 0, 716, 236, 1, 0, 0, 0, 717, 718, 5, 35, 0, 0, 718, 238, 1, 0, 0, 0, 719, 720, 5, 43, 0, 0, 720, 240, 1, 0, 0, 0, 721, 722, 5, 45, 0, 0, 722, 242, 1, 0, 0, 0, 723, 724, 5, 61, 0, 0, 724, 244, 1, 0, 0, 0, 725, 726, 5, 46, 0, 0, 726, 246, 1, 0, 0, 0, 727, 728, 5, 124, 0, 0, 728, 248, 1, 0, 0, 0, 729, 730, 5, 96, 0, 0, 730, 250, 1, 0, 0, 0, 731, 732, 5, 94, 0, 0, 732, 252, 1, 0, 0, 0, 733, 734, 5, 126, 0, 0, 734, 254, 1, 0, 0, 0, 735, 736, 5, 60, 0, 0, 736, 256, 1, 0, 0, 0, 737, 738, 5, 62, 0, 0, 738, 258, 1, 0, 0, 0, 739, 740, 5, 47, 0, 0, 740, 260, 1, 0, 0, 0, 741, 742, 5, 92, 0, 0, 742, 262, 1, 0, 0, 0, 743, 744, 5, 95, 0, 0, 744, 264, 1, 0, 0, 0, 745, 746, 5, 36, 0, 0, 746, 266, 1, 0, 0, 0, 747, 748, 5, 40, 0, 0, 748, 268, 1, 0, 0, 0, 749, 750, 5, 41, 0, 0, 750, 270, 1, 0, 0, 0, 751, 752, 5, 58, 0, 0, 752, 272, 1, 0, 0, 0, 753, 754, 5, 59, 0, 0, 754, 274, 1, 0, 0, 0, 755, 756, 5, 44, 0, 0, 756, 276, 1, 0, 0, 0, 757, 758, 5, 63, 0, 0, 758, 278, 1, 0, 0, 0, 759, 760, 5, 32, 0, 0, 760, 280, 1, 0, 0, 0, 761, 762, 5, 42, 0, 0, 762, 763, 5, 109, 0, 0, 763, 764, 5, 73, 0, 0, 764, 766, 1, 0, 0, 0, 765, 767, 5, 34, 0, 0, 766, 765, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 769, 3, 285, 142, 0, 769, 282, 1, 0, 0, 0, 770, 771, 5, 42, 0, 0, 771, 772, 5, 73, 0, 0, 772, 774, 1, 0, 0, 0, 773, 775, 5, 34, 0, 0, 774, 773, 1, 0, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 3, 285, 142, 0, 777, 284, 1, 0, 0, 0, 778, 780, 8, 3, 0, 0, 779, 778, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 781, 782, 1, 0, 0, 0, 782, 286, 1, 0, 0, 0, 783, 785, 8, 4, 0, 0, 784, 783, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 288, 1, 0, 0, 0, 788, 792, 8, 5, 0, 0, 789, 791, 8, 3, 0, 0, 790, 789, 1, 0, 0, 0, 791, 794, 1, 0, 0, 0, 792, 790, 1, 0, 0, 0, 792, 793, 1, 0, 0, 0, 793, 290, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 12, 0, 347, 402, 405, 423, 547, 553, 766, 774, 781, 786, 792, 0]