mail 2.7.0.rc1 → 2.7.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +71 -98
  3. data/lib/mail.rb +1 -6
  4. data/lib/mail/attachments_list.rb +5 -2
  5. data/lib/mail/body.rb +39 -33
  6. data/lib/mail/check_delivery_params.rb +8 -6
  7. data/lib/mail/configuration.rb +2 -0
  8. data/lib/mail/elements/address.rb +19 -18
  9. data/lib/mail/encodings.rb +89 -31
  10. data/lib/mail/encodings/7bit.rb +5 -15
  11. data/lib/mail/encodings/8bit.rb +2 -21
  12. data/lib/mail/encodings/base64.rb +11 -12
  13. data/lib/mail/encodings/binary.rb +3 -22
  14. data/lib/mail/encodings/identity.rb +24 -0
  15. data/lib/mail/encodings/quoted_printable.rb +6 -6
  16. data/lib/mail/encodings/transfer_encoding.rb +38 -29
  17. data/lib/mail/encodings/unix_to_unix.rb +2 -1
  18. data/lib/mail/envelope.rb +1 -1
  19. data/lib/mail/field.rb +93 -61
  20. data/lib/mail/fields/bcc_field.rb +2 -2
  21. data/lib/mail/fields/cc_field.rb +1 -1
  22. data/lib/mail/fields/comments_field.rb +1 -1
  23. data/lib/mail/fields/common/common_address.rb +32 -7
  24. data/lib/mail/fields/common/common_field.rb +1 -10
  25. data/lib/mail/fields/content_description_field.rb +1 -1
  26. data/lib/mail/fields/content_disposition_field.rb +3 -3
  27. data/lib/mail/fields/content_id_field.rb +2 -2
  28. data/lib/mail/fields/content_location_field.rb +1 -1
  29. data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
  30. data/lib/mail/fields/content_type_field.rb +1 -1
  31. data/lib/mail/fields/date_field.rb +2 -3
  32. data/lib/mail/fields/from_field.rb +1 -1
  33. data/lib/mail/fields/in_reply_to_field.rb +1 -1
  34. data/lib/mail/fields/keywords_field.rb +1 -1
  35. data/lib/mail/fields/message_id_field.rb +1 -1
  36. data/lib/mail/fields/mime_version_field.rb +1 -1
  37. data/lib/mail/fields/optional_field.rb +4 -1
  38. data/lib/mail/fields/received_field.rb +1 -1
  39. data/lib/mail/fields/references_field.rb +1 -1
  40. data/lib/mail/fields/reply_to_field.rb +1 -1
  41. data/lib/mail/fields/resent_bcc_field.rb +1 -1
  42. data/lib/mail/fields/resent_cc_field.rb +1 -1
  43. data/lib/mail/fields/resent_date_field.rb +0 -1
  44. data/lib/mail/fields/resent_from_field.rb +1 -1
  45. data/lib/mail/fields/resent_message_id_field.rb +1 -1
  46. data/lib/mail/fields/resent_sender_field.rb +1 -1
  47. data/lib/mail/fields/resent_to_field.rb +1 -1
  48. data/lib/mail/fields/return_path_field.rb +1 -1
  49. data/lib/mail/fields/sender_field.rb +1 -1
  50. data/lib/mail/fields/subject_field.rb +1 -1
  51. data/lib/mail/fields/to_field.rb +1 -1
  52. data/lib/mail/fields/unstructured_field.rb +19 -2
  53. data/lib/mail/header.rb +9 -8
  54. data/lib/mail/mail.rb +2 -10
  55. data/lib/mail/matchers/has_sent_mail.rb +21 -1
  56. data/lib/mail/message.rb +64 -51
  57. data/lib/mail/multibyte.rb +14 -16
  58. data/lib/mail/multibyte/chars.rb +2 -1
  59. data/lib/mail/network.rb +1 -0
  60. data/lib/mail/network/delivery_methods/exim.rb +6 -10
  61. data/lib/mail/network/delivery_methods/logger_delivery.rb +37 -0
  62. data/lib/mail/network/delivery_methods/sendmail.rb +8 -4
  63. data/lib/mail/network/delivery_methods/smtp.rb +56 -55
  64. data/lib/mail/network/delivery_methods/smtp_connection.rb +9 -1
  65. data/lib/mail/network/retriever_methods/imap.rb +18 -5
  66. data/lib/mail/network/retriever_methods/pop3.rb +3 -1
  67. data/lib/mail/parser_tools.rb +15 -0
  68. data/lib/mail/parsers/address_lists_parser.rb +30462 -12597
  69. data/lib/mail/parsers/address_lists_parser.rl +18 -12
  70. data/lib/mail/parsers/content_disposition_parser.rb +405 -215
  71. data/lib/mail/parsers/content_disposition_parser.rl +11 -5
  72. data/lib/mail/parsers/content_location_parser.rb +443 -208
  73. data/lib/mail/parsers/content_location_parser.rl +9 -3
  74. data/lib/mail/parsers/content_transfer_encoding_parser.rb +180 -80
  75. data/lib/mail/parsers/content_transfer_encoding_parser.rl +8 -2
  76. data/lib/mail/parsers/content_type_parser.rb +436 -245
  77. data/lib/mail/parsers/content_type_parser.rl +12 -6
  78. data/lib/mail/parsers/date_time_parser.rb +172 -72
  79. data/lib/mail/parsers/date_time_parser.rl +10 -4
  80. data/lib/mail/parsers/envelope_from_parser.rb +2833 -1320
  81. data/lib/mail/parsers/envelope_from_parser.rl +9 -3
  82. data/lib/mail/parsers/message_ids_parser.rb +2325 -976
  83. data/lib/mail/parsers/message_ids_parser.rl +9 -3
  84. data/lib/mail/parsers/mime_version_parser.rb +164 -64
  85. data/lib/mail/parsers/mime_version_parser.rl +9 -3
  86. data/lib/mail/parsers/phrase_lists_parser.rb +582 -237
  87. data/lib/mail/parsers/phrase_lists_parser.rl +9 -3
  88. data/lib/mail/parsers/received_parser.rb +7036 -3004
  89. data/lib/mail/parsers/received_parser.rl +11 -5
  90. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +1 -0
  91. data/lib/mail/parsers/rfc2045_content_type.rl +1 -0
  92. data/lib/mail/parsers/rfc2045_mime.rl +1 -0
  93. data/lib/mail/parsers/rfc2183_content_disposition.rl +1 -0
  94. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  95. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +7 -1
  96. data/lib/mail/parsers/rfc5322.rl +3 -1
  97. data/lib/mail/parsers/rfc5322_address.rl +3 -1
  98. data/lib/mail/parsers/rfc5322_date_time.rl +1 -0
  99. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +9 -5
  100. data/lib/mail/part.rb +1 -1
  101. data/lib/mail/utilities.rb +44 -15
  102. data/lib/mail/version.rb +1 -1
  103. data/lib/mail/version_specific/ruby_1_8.rb +12 -1
  104. data/lib/mail/version_specific/ruby_1_9.rb +13 -1
  105. metadata +7 -13
  106. data/CHANGELOG.rdoc +0 -822
  107. data/CONTRIBUTING.md +0 -60
  108. data/Dependencies.txt +0 -1
  109. data/Gemfile +0 -11
  110. data/Rakefile +0 -23
  111. data/TODO.rdoc +0 -9
  112. data/lib/mail/multibyte/exceptions.rb +0 -9
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  require 'mail/utilities'
3
+ require 'mail/parser_tools'
3
4
 
4
5
  %%{
5
6
  machine address_lists;
7
+ alphtype int;
6
8
 
7
9
  # Phrase
8
10
  action phrase_s { phrase_s = p }
@@ -10,13 +12,13 @@ require 'mail/utilities'
10
12
 
11
13
  # Quoted String.
12
14
  action qstr_s { qstr_s = p }
13
- action qstr_e { qstr = data[qstr_s..(p-1)] }
15
+ action qstr_e { qstr = chars(data, qstr_s, p-1) }
14
16
 
15
17
  # Comment
16
18
  action comment_s { comment_s = p unless comment_s }
17
19
  action comment_e {
18
20
  if address
19
- address.comments << data[comment_s..(p-2)]
21
+ address.comments << chars(data, comment_s, p-2)
20
22
  end
21
23
  comment_s = nil
22
24
  }
@@ -28,7 +30,7 @@ require 'mail/utilities'
28
30
  group = qstr
29
31
  qstr = nil
30
32
  else
31
- group = data[group_name_s..(p-1)]
33
+ group = chars(data, group_name_s, p-1)
32
34
  group_name_s = nil
33
35
  end
34
36
  address_list.group_names << group
@@ -42,18 +44,18 @@ require 'mail/utilities'
42
44
 
43
45
  # Address
44
46
  action address_s { address_s = p }
47
+
48
+ # Ignore address end events without a start event.
45
49
  action address_e {
46
- # Ignore address end events if they don't have
47
- # a matching address start event.
48
50
  if address_s
49
51
  if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
50
52
  if address.domain
51
- address.local = data[local_dot_atom_s..local_dot_atom_e] if address
53
+ address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
52
54
  else
53
- address.local = data[local_dot_atom_s..local_dot_atom_pre_comment_e] if address
55
+ address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
54
56
  end
55
57
  end
56
- address.raw = data[address_s..(p-1)]
58
+ address.raw = chars(data, address_s, p-1)
57
59
  address_list.addresses << address if address
58
60
 
59
61
  # Start next address
@@ -71,7 +73,7 @@ require 'mail/utilities'
71
73
  address.display_name = Mail::Utilities.unescape(qstr)
72
74
  qstr = nil
73
75
  elsif phrase_e
74
- address.display_name = data[phrase_s..phrase_e].strip
76
+ address.display_name = chars(data, phrase_s, phrase_e).strip
75
77
  phrase_e = phrase_s = nil
76
78
  end
77
79
  }
@@ -79,7 +81,7 @@ require 'mail/utilities'
79
81
  # Domain
80
82
  action domain_s { domain_s = p }
81
83
  action domain_e {
82
- address.domain = data[domain_s..(p-1)].rstrip if address
84
+ address.domain = chars(data, domain_s, p-1).rstrip if address
83
85
  }
84
86
 
85
87
  # Local
@@ -90,7 +92,7 @@ require 'mail/utilities'
90
92
 
91
93
  # obs_domain_list
92
94
  action obs_domain_list_s { obs_domain_list_s = p }
93
- action obs_domain_list_e { address.obs_domain_list = data[obs_domain_list_s..(p-1)] }
95
+ action obs_domain_list_e { address.obs_domain_list = chars(data, obs_domain_list_s, p-1) }
94
96
 
95
97
  # Junk actions
96
98
  action addr_spec { }
@@ -129,6 +131,8 @@ require 'mail/utilities'
129
131
 
130
132
  module Mail::Parsers
131
133
  module AddressListsParser
134
+ extend Mail::ParserTools
135
+
132
136
  AddressListStruct = Struct.new(:addresses, :group_names, :error)
133
137
  AddressStruct = Struct.new(:raw, :domain, :comments, :local,
134
138
  :obs_domain_list, :display_name, :group, :error)
@@ -136,6 +140,8 @@ module Mail::Parsers
136
140
  %%write data noprefix;
137
141
 
138
142
  def self.parse(data)
143
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
144
+
139
145
  address_list = AddressListStruct.new([], [])
140
146
  return address_list if Mail::Utilities.blank?(data)
141
147
 
@@ -157,7 +163,7 @@ module Mail::Parsers
157
163
  %%write exec;
158
164
 
159
165
  if p != eof || cs < %%{ write first_final; }%%
160
- raise Mail::Field::ParseError.new(Mail::AddressList, data, "Only able to parse up to #{data[0..p]}")
166
+ raise Mail::Field::IncompleteParseError.new(Mail::AddressList, data, p)
161
167
  end
162
168
 
163
169
  address_list
@@ -1,12 +1,15 @@
1
1
 
2
2
  # frozen_string_literal: true
3
3
  require 'mail/utilities'
4
+ require 'mail/parser_tools'
4
5
 
5
6
 
6
7
 
7
8
 
8
9
  module Mail::Parsers
9
10
  module ContentDispositionParser
11
+ extend Mail::ParserTools
12
+
10
13
  ContentDispositionStruct = Struct.new(:disposition_type, :parameters, :error)
11
14
 
12
15
 
@@ -18,16 +21,21 @@ self._trans_keys = [
18
21
  0, 0, 33, 126, 9, 126,
19
22
  10, 10, 9, 32, 33,
20
23
  126, 9, 126, 9, 40,
21
- 10, 10, 9, 32, 1, 127,
22
- 1, 127, 10, 10, 9,
24
+ 10, 10, 9, 32, 1, 244,
25
+ 1, 244, 10, 10, 9,
23
26
  32, 10, 10, 9, 32,
24
- -128, -1, 9, 40, 10, 10,
25
- 9, 32, 9, 126, 1,
26
- 127, 1, 127, 10, 10,
27
- 9, 32, -128, -1, 33, 126,
28
- 9, 59, 9, 59, 9,
29
- 126, 9, 59, 9, 59,
30
- 0, 0, 0
27
+ 0, 244, 128, 191, 160, 191,
28
+ 128, 191, 128, 159, 144,
29
+ 191, 128, 191, 128, 143,
30
+ 9, 40, 10, 10, 9, 32,
31
+ 9, 126, 1, 244, 1,
32
+ 244, 10, 10, 9, 32,
33
+ 0, 244, 128, 191, 160, 191,
34
+ 128, 191, 128, 159, 144,
35
+ 191, 128, 191, 128, 143,
36
+ 33, 126, 9, 59, 9, 59,
37
+ 9, 126, 9, 59, 9,
38
+ 59, 0, 0, 0
31
39
  ]
32
40
 
33
41
  class << self
@@ -36,10 +44,11 @@ class << self
36
44
  end
37
45
  self._key_spans = [
38
46
  0, 94, 118, 1, 24, 94, 118, 32,
39
- 1, 24, 127, 127, 1, 24, 1, 24,
40
- 128, 32, 1, 24, 118, 127, 127, 1,
41
- 24, 128, 94, 51, 51, 118, 51, 51,
42
- 0
47
+ 1, 24, 244, 244, 1, 24, 1, 24,
48
+ 245, 64, 32, 64, 32, 48, 64, 16,
49
+ 32, 1, 24, 118, 244, 244, 1, 24,
50
+ 245, 64, 32, 64, 32, 48, 64, 16,
51
+ 94, 51, 51, 118, 51, 51, 0
43
52
  ]
44
53
 
45
54
  class << self
@@ -48,10 +57,11 @@ class << self
48
57
  end
49
58
  self._index_offsets = [
50
59
  0, 0, 95, 214, 216, 241, 336, 455,
51
- 488, 490, 515, 643, 771, 773, 798, 800,
52
- 825, 954, 987, 989, 1014, 1133, 1261, 1389,
53
- 1391, 1416, 1545, 1640, 1692, 1744, 1863, 1915,
54
- 1967
60
+ 488, 490, 515, 760, 1005, 1007, 1032, 1034,
61
+ 1059, 1305, 1370, 1403, 1468, 1501, 1550, 1615,
62
+ 1632, 1665, 1667, 1692, 1811, 2056, 2301, 2303,
63
+ 2328, 2574, 2639, 2672, 2737, 2770, 2819, 2884,
64
+ 2901, 2996, 3048, 3100, 3219, 3271, 3323
55
65
  ]
56
66
 
57
67
  class << self
@@ -139,173 +149,342 @@ self._indicies = [
139
149
  19, 19, 19, 19, 19, 19, 19, 19,
140
150
  19, 19, 19, 19, 19, 19, 19, 19,
141
151
  19, 19, 19, 19, 19, 19, 19, 19,
142
- 19, 19, 1, 23, 23, 23, 23, 23,
143
- 23, 23, 23, 23, 1, 23, 23, 24,
144
- 23, 23, 23, 23, 23, 23, 23, 23,
145
- 23, 23, 23, 23, 23, 23, 23, 23,
146
- 23, 23, 23, 23, 25, 23, 23, 23,
147
- 23, 23, 23, 23, 23, 23, 23, 23,
148
- 23, 23, 23, 23, 23, 23, 23, 23,
149
- 23, 23, 23, 23, 23, 23, 23, 23,
150
- 23, 23, 23, 23, 23, 23, 23, 23,
151
- 23, 23, 23, 23, 23, 23, 23, 23,
152
- 23, 23, 23, 23, 23, 23, 23, 23,
153
- 23, 23, 23, 23, 23, 23, 26, 23,
154
- 23, 23, 23, 23, 23, 23, 23, 23,
155
- 23, 23, 23, 23, 23, 23, 23, 23,
156
- 23, 23, 23, 23, 23, 23, 23, 23,
157
- 23, 23, 23, 23, 23, 23, 23, 23,
158
- 23, 23, 1, 27, 1, 23, 1, 1,
159
- 1, 1, 1, 1, 1, 1, 1, 1,
160
- 1, 1, 1, 1, 1, 1, 1, 1,
161
- 1, 1, 1, 1, 23, 1, 28, 1,
162
- 29, 1, 1, 1, 1, 1, 1, 1,
163
- 1, 1, 1, 1, 1, 1, 1, 1,
164
- 1, 1, 1, 1, 1, 1, 1, 29,
165
- 1, 1, 1, 1, 1, 1, 1, 1,
166
- 1, 1, 1, 1, 1, 1, 1, 1,
167
- 1, 1, 1, 1, 1, 1, 1, 1,
168
- 1, 1, 1, 1, 1, 1, 1, 1,
169
- 1, 1, 1, 1, 1, 1, 1, 1,
170
- 1, 1, 1, 1, 1, 1, 1, 1,
171
- 1, 1, 1, 1, 1, 1, 1, 1,
172
- 1, 1, 1, 1, 1, 1, 1, 1,
173
- 1, 1, 1, 1, 1, 1, 1, 1,
174
- 1, 1, 1, 1, 1, 1, 1, 1,
175
- 1, 1, 1, 1, 1, 1, 1, 1,
176
- 1, 1, 1, 1, 1, 1, 1, 1,
177
- 1, 1, 1, 1, 1, 1, 1, 1,
178
- 1, 1, 1, 1, 1, 1, 1, 1,
179
- 1, 1, 1, 1, 1, 1, 1, 1,
180
- 1, 1, 1, 1, 1, 1, 1, 1,
181
- 1, 23, 30, 1, 1, 1, 31, 1,
182
- 1, 1, 1, 1, 1, 1, 1, 1,
152
+ 19, 19, 1, 1, 1, 1, 1, 1,
183
153
  1, 1, 1, 1, 1, 1, 1, 1,
184
- 1, 30, 1, 32, 1, 1, 1, 1,
185
- 1, 33, 1, 34, 1, 35, 1, 1,
186
154
  1, 1, 1, 1, 1, 1, 1, 1,
187
155
  1, 1, 1, 1, 1, 1, 1, 1,
188
- 1, 1, 1, 1, 35, 1, 36, 1,
189
- 1, 1, 37, 1, 1, 1, 1, 1,
190
156
  1, 1, 1, 1, 1, 1, 1, 1,
191
- 1, 1, 1, 1, 1, 36, 38, 38,
192
- 38, 38, 38, 38, 38, 39, 1, 38,
193
- 38, 38, 38, 38, 1, 38, 38, 38,
194
- 38, 38, 38, 38, 38, 38, 38, 1,
195
- 1, 1, 1, 1, 1, 1, 38, 38,
196
- 38, 38, 38, 38, 38, 38, 38, 38,
197
- 38, 38, 38, 38, 38, 38, 38, 38,
198
- 38, 38, 38, 38, 38, 38, 38, 38,
199
- 1, 1, 1, 38, 38, 38, 38, 38,
200
- 38, 38, 38, 38, 38, 38, 38, 38,
201
- 38, 38, 38, 38, 38, 38, 38, 38,
202
- 38, 38, 38, 38, 38, 38, 38, 38,
203
- 38, 38, 38, 38, 1, 40, 40, 40,
204
- 40, 40, 40, 40, 40, 40, 1, 40,
205
- 40, 41, 40, 40, 40, 40, 40, 40,
206
- 40, 40, 40, 40, 40, 40, 40, 40,
207
- 40, 40, 40, 40, 40, 40, 40, 40,
208
- 40, 40, 40, 40, 42, 43, 40, 40,
209
- 40, 40, 40, 40, 40, 40, 40, 40,
210
- 40, 40, 40, 40, 40, 40, 40, 40,
211
- 40, 40, 40, 40, 40, 40, 40, 40,
212
- 40, 40, 40, 40, 40, 40, 40, 40,
213
- 40, 40, 40, 40, 40, 40, 40, 40,
214
- 40, 40, 40, 40, 40, 40, 40, 40,
215
- 44, 40, 40, 40, 40, 40, 40, 40,
216
- 40, 40, 40, 40, 40, 40, 40, 40,
217
- 40, 40, 40, 40, 40, 40, 40, 40,
218
- 40, 40, 40, 40, 40, 40, 40, 40,
219
- 40, 40, 40, 40, 1, 45, 45, 45,
220
- 45, 45, 45, 45, 45, 45, 1, 45,
221
- 45, 46, 45, 45, 45, 45, 45, 45,
222
- 45, 45, 45, 45, 45, 45, 45, 45,
223
- 45, 45, 45, 45, 45, 45, 45, 45,
224
- 45, 45, 45, 45, 47, 48, 45, 45,
225
- 45, 45, 45, 45, 45, 45, 45, 45,
226
- 45, 45, 45, 45, 45, 45, 45, 45,
227
- 45, 45, 45, 45, 45, 45, 45, 45,
228
- 45, 45, 45, 45, 45, 45, 45, 45,
229
- 45, 45, 45, 45, 45, 45, 45, 45,
230
- 45, 45, 45, 45, 45, 45, 45, 45,
231
- 49, 45, 45, 45, 45, 45, 45, 45,
232
- 45, 45, 45, 45, 45, 45, 45, 45,
233
- 45, 45, 45, 45, 45, 45, 45, 45,
234
- 45, 45, 45, 45, 45, 45, 45, 45,
235
- 45, 45, 45, 45, 1, 50, 1, 45,
236
157
  1, 1, 1, 1, 1, 1, 1, 1,
237
158
  1, 1, 1, 1, 1, 1, 1, 1,
238
- 1, 1, 1, 1, 1, 1, 45, 1,
239
159
  1, 1, 1, 1, 1, 1, 1, 1,
160
+ 1, 1, 1, 1, 23, 23, 23, 23,
161
+ 23, 23, 23, 23, 23, 23, 23, 23,
162
+ 23, 23, 23, 23, 23, 23, 23, 23,
163
+ 23, 23, 23, 23, 23, 23, 23, 23,
164
+ 23, 23, 24, 25, 25, 25, 25, 25,
165
+ 25, 25, 25, 25, 25, 25, 25, 26,
166
+ 25, 25, 27, 28, 28, 28, 29, 1,
167
+ 30, 30, 30, 30, 30, 30, 30, 30,
168
+ 30, 1, 30, 30, 31, 30, 30, 30,
169
+ 30, 30, 30, 30, 30, 30, 30, 30,
170
+ 30, 30, 30, 30, 30, 30, 30, 30,
171
+ 30, 32, 30, 30, 30, 30, 30, 30,
172
+ 30, 30, 30, 30, 30, 30, 30, 30,
173
+ 30, 30, 30, 30, 30, 30, 30, 30,
174
+ 30, 30, 30, 30, 30, 30, 30, 30,
175
+ 30, 30, 30, 30, 30, 30, 30, 30,
176
+ 30, 30, 30, 30, 30, 30, 30, 30,
177
+ 30, 30, 30, 30, 30, 30, 30, 30,
178
+ 30, 30, 30, 33, 30, 30, 30, 30,
179
+ 30, 30, 30, 30, 30, 30, 30, 30,
180
+ 30, 30, 30, 30, 30, 30, 30, 30,
181
+ 30, 30, 30, 30, 30, 30, 30, 30,
182
+ 30, 30, 30, 30, 30, 30, 30, 1,
183
+ 1, 1, 1, 1, 1, 1, 1, 1,
184
+ 1, 1, 1, 1, 1, 1, 1, 1,
185
+ 1, 1, 1, 1, 1, 1, 1, 1,
186
+ 1, 1, 1, 1, 1, 1, 1, 1,
187
+ 1, 1, 1, 1, 1, 1, 1, 1,
188
+ 1, 1, 1, 1, 1, 1, 1, 1,
189
+ 1, 1, 1, 1, 1, 1, 1, 1,
190
+ 1, 1, 1, 1, 1, 1, 1, 1,
191
+ 1, 34, 34, 34, 34, 34, 34, 34,
192
+ 34, 34, 34, 34, 34, 34, 34, 34,
193
+ 34, 34, 34, 34, 34, 34, 34, 34,
194
+ 34, 34, 34, 34, 34, 34, 34, 35,
195
+ 36, 36, 36, 36, 36, 36, 36, 36,
196
+ 36, 36, 36, 36, 37, 36, 36, 38,
197
+ 39, 39, 39, 40, 1, 41, 1, 30,
198
+ 1, 1, 1, 1, 1, 1, 1, 1,
199
+ 1, 1, 1, 1, 1, 1, 1, 1,
200
+ 1, 1, 1, 1, 1, 1, 30, 1,
201
+ 42, 1, 43, 1, 1, 1, 1, 1,
202
+ 1, 1, 1, 1, 1, 1, 1, 1,
203
+ 1, 1, 1, 1, 1, 1, 1, 1,
204
+ 1, 43, 1, 30, 30, 30, 30, 30,
205
+ 30, 30, 30, 30, 30, 30, 30, 30,
206
+ 30, 30, 30, 30, 30, 30, 30, 30,
207
+ 30, 30, 30, 30, 30, 30, 30, 30,
208
+ 30, 30, 30, 30, 30, 30, 30, 30,
209
+ 30, 30, 30, 30, 30, 30, 30, 30,
210
+ 30, 30, 30, 30, 30, 30, 30, 30,
211
+ 30, 30, 30, 30, 30, 30, 30, 30,
212
+ 30, 30, 30, 30, 30, 30, 30, 30,
213
+ 30, 30, 30, 30, 30, 30, 30, 30,
214
+ 30, 30, 30, 30, 30, 30, 30, 30,
215
+ 30, 30, 30, 30, 30, 30, 30, 30,
216
+ 30, 30, 30, 30, 30, 30, 30, 30,
217
+ 30, 30, 30, 30, 30, 30, 30, 30,
218
+ 30, 30, 30, 30, 30, 30, 30, 30,
219
+ 30, 30, 30, 30, 30, 30, 30, 30,
220
+ 30, 30, 30, 1, 1, 1, 1, 1,
221
+ 1, 1, 1, 1, 1, 1, 1, 1,
222
+ 1, 1, 1, 1, 1, 1, 1, 1,
223
+ 1, 1, 1, 1, 1, 1, 1, 1,
224
+ 1, 1, 1, 1, 1, 1, 1, 1,
225
+ 1, 1, 1, 1, 1, 1, 1, 1,
226
+ 1, 1, 1, 1, 1, 1, 1, 1,
227
+ 1, 1, 1, 1, 1, 1, 1, 1,
228
+ 1, 1, 1, 1, 1, 34, 34, 34,
229
+ 34, 34, 34, 34, 34, 34, 34, 34,
230
+ 34, 34, 34, 34, 34, 34, 34, 34,
231
+ 34, 34, 34, 34, 34, 34, 34, 34,
232
+ 34, 34, 34, 35, 36, 36, 36, 36,
233
+ 36, 36, 36, 36, 36, 36, 36, 36,
234
+ 37, 36, 36, 38, 39, 39, 39, 40,
235
+ 1, 30, 30, 30, 30, 30, 30, 30,
236
+ 30, 30, 30, 30, 30, 30, 30, 30,
237
+ 30, 30, 30, 30, 30, 30, 30, 30,
238
+ 30, 30, 30, 30, 30, 30, 30, 30,
239
+ 30, 30, 30, 30, 30, 30, 30, 30,
240
+ 30, 30, 30, 30, 30, 30, 30, 30,
241
+ 30, 30, 30, 30, 30, 30, 30, 30,
242
+ 30, 30, 30, 30, 30, 30, 30, 30,
243
+ 30, 1, 34, 34, 34, 34, 34, 34,
244
+ 34, 34, 34, 34, 34, 34, 34, 34,
245
+ 34, 34, 34, 34, 34, 34, 34, 34,
246
+ 34, 34, 34, 34, 34, 34, 34, 34,
247
+ 34, 34, 1, 34, 34, 34, 34, 34,
248
+ 34, 34, 34, 34, 34, 34, 34, 34,
249
+ 34, 34, 34, 34, 34, 34, 34, 34,
250
+ 34, 34, 34, 34, 34, 34, 34, 34,
251
+ 34, 34, 34, 34, 34, 34, 34, 34,
252
+ 34, 34, 34, 34, 34, 34, 34, 34,
253
+ 34, 34, 34, 34, 34, 34, 34, 34,
254
+ 34, 34, 34, 34, 34, 34, 34, 34,
255
+ 34, 34, 34, 1, 34, 34, 34, 34,
256
+ 34, 34, 34, 34, 34, 34, 34, 34,
257
+ 34, 34, 34, 34, 34, 34, 34, 34,
258
+ 34, 34, 34, 34, 34, 34, 34, 34,
259
+ 34, 34, 34, 34, 1, 36, 36, 36,
260
+ 36, 36, 36, 36, 36, 36, 36, 36,
261
+ 36, 36, 36, 36, 36, 36, 36, 36,
262
+ 36, 36, 36, 36, 36, 36, 36, 36,
263
+ 36, 36, 36, 36, 36, 36, 36, 36,
264
+ 36, 36, 36, 36, 36, 36, 36, 36,
265
+ 36, 36, 36, 36, 36, 1, 36, 36,
266
+ 36, 36, 36, 36, 36, 36, 36, 36,
267
+ 36, 36, 36, 36, 36, 36, 36, 36,
268
+ 36, 36, 36, 36, 36, 36, 36, 36,
269
+ 36, 36, 36, 36, 36, 36, 36, 36,
270
+ 36, 36, 36, 36, 36, 36, 36, 36,
271
+ 36, 36, 36, 36, 36, 36, 36, 36,
272
+ 36, 36, 36, 36, 36, 36, 36, 36,
273
+ 36, 36, 36, 36, 36, 36, 1, 36,
274
+ 36, 36, 36, 36, 36, 36, 36, 36,
275
+ 36, 36, 36, 36, 36, 36, 36, 1,
276
+ 44, 1, 1, 1, 45, 1, 1, 1,
277
+ 1, 1, 1, 1, 1, 1, 1, 1,
278
+ 1, 1, 1, 1, 1, 1, 1, 44,
279
+ 1, 46, 1, 1, 1, 1, 1, 47,
280
+ 1, 48, 1, 49, 1, 1, 1, 1,
281
+ 1, 1, 1, 1, 1, 1, 1, 1,
282
+ 1, 1, 1, 1, 1, 1, 1, 1,
283
+ 1, 1, 49, 1, 50, 1, 1, 1,
284
+ 51, 1, 1, 1, 1, 1, 1, 1,
285
+ 1, 1, 1, 1, 1, 1, 1, 1,
286
+ 1, 1, 1, 50, 52, 52, 52, 52,
287
+ 52, 52, 52, 53, 1, 52, 52, 52,
288
+ 52, 52, 1, 52, 52, 52, 52, 52,
289
+ 52, 52, 52, 52, 52, 1, 1, 1,
290
+ 1, 1, 1, 1, 52, 52, 52, 52,
291
+ 52, 52, 52, 52, 52, 52, 52, 52,
292
+ 52, 52, 52, 52, 52, 52, 52, 52,
293
+ 52, 52, 52, 52, 52, 52, 1, 1,
294
+ 1, 52, 52, 52, 52, 52, 52, 52,
295
+ 52, 52, 52, 52, 52, 52, 52, 52,
296
+ 52, 52, 52, 52, 52, 52, 52, 52,
297
+ 52, 52, 52, 52, 52, 52, 52, 52,
298
+ 52, 52, 1, 54, 54, 54, 54, 54,
299
+ 54, 54, 54, 54, 1, 54, 54, 55,
300
+ 54, 54, 54, 54, 54, 54, 54, 54,
301
+ 54, 54, 54, 54, 54, 54, 54, 54,
302
+ 54, 54, 54, 54, 54, 54, 54, 54,
303
+ 54, 54, 56, 57, 54, 54, 54, 54,
304
+ 54, 54, 54, 54, 54, 54, 54, 54,
305
+ 54, 54, 54, 54, 54, 54, 54, 54,
306
+ 54, 54, 54, 54, 54, 54, 54, 54,
307
+ 54, 54, 54, 54, 54, 54, 54, 54,
308
+ 54, 54, 54, 54, 54, 54, 54, 54,
309
+ 54, 54, 54, 54, 54, 54, 58, 54,
310
+ 54, 54, 54, 54, 54, 54, 54, 54,
311
+ 54, 54, 54, 54, 54, 54, 54, 54,
312
+ 54, 54, 54, 54, 54, 54, 54, 54,
313
+ 54, 54, 54, 54, 54, 54, 54, 54,
314
+ 54, 54, 1, 1, 1, 1, 1, 1,
315
+ 1, 1, 1, 1, 1, 1, 1, 1,
316
+ 1, 1, 1, 1, 1, 1, 1, 1,
317
+ 1, 1, 1, 1, 1, 1, 1, 1,
318
+ 1, 1, 1, 1, 1, 1, 1, 1,
319
+ 1, 1, 1, 1, 1, 1, 1, 1,
320
+ 1, 1, 1, 1, 1, 1, 1, 1,
321
+ 1, 1, 1, 1, 1, 1, 1, 1,
322
+ 1, 1, 1, 1, 59, 59, 59, 59,
323
+ 59, 59, 59, 59, 59, 59, 59, 59,
324
+ 59, 59, 59, 59, 59, 59, 59, 59,
325
+ 59, 59, 59, 59, 59, 59, 59, 59,
326
+ 59, 59, 60, 61, 61, 61, 61, 61,
327
+ 61, 61, 61, 61, 61, 61, 61, 62,
328
+ 61, 61, 63, 64, 64, 64, 65, 1,
329
+ 66, 66, 66, 66, 66, 66, 66, 66,
330
+ 66, 1, 66, 66, 67, 66, 66, 66,
331
+ 66, 66, 66, 66, 66, 66, 66, 66,
332
+ 66, 66, 66, 66, 66, 66, 66, 66,
333
+ 66, 66, 66, 66, 66, 66, 66, 68,
334
+ 69, 66, 66, 66, 66, 66, 66, 66,
335
+ 66, 66, 66, 66, 66, 66, 66, 66,
336
+ 66, 66, 66, 66, 66, 66, 66, 66,
337
+ 66, 66, 66, 66, 66, 66, 66, 66,
338
+ 66, 66, 66, 66, 66, 66, 66, 66,
339
+ 66, 66, 66, 66, 66, 66, 66, 66,
340
+ 66, 66, 66, 70, 66, 66, 66, 66,
341
+ 66, 66, 66, 66, 66, 66, 66, 66,
342
+ 66, 66, 66, 66, 66, 66, 66, 66,
343
+ 66, 66, 66, 66, 66, 66, 66, 66,
344
+ 66, 66, 66, 66, 66, 66, 66, 1,
345
+ 1, 1, 1, 1, 1, 1, 1, 1,
346
+ 1, 1, 1, 1, 1, 1, 1, 1,
347
+ 1, 1, 1, 1, 1, 1, 1, 1,
348
+ 1, 1, 1, 1, 1, 1, 1, 1,
349
+ 1, 1, 1, 1, 1, 1, 1, 1,
350
+ 1, 1, 1, 1, 1, 1, 1, 1,
351
+ 1, 1, 1, 1, 1, 1, 1, 1,
352
+ 1, 1, 1, 1, 1, 1, 1, 1,
353
+ 1, 71, 71, 71, 71, 71, 71, 71,
354
+ 71, 71, 71, 71, 71, 71, 71, 71,
355
+ 71, 71, 71, 71, 71, 71, 71, 71,
356
+ 71, 71, 71, 71, 71, 71, 71, 72,
357
+ 73, 73, 73, 73, 73, 73, 73, 73,
358
+ 73, 73, 73, 73, 74, 73, 73, 75,
359
+ 76, 76, 76, 77, 1, 78, 1, 66,
240
360
  1, 1, 1, 1, 1, 1, 1, 1,
241
361
  1, 1, 1, 1, 1, 1, 1, 1,
242
- 1, 1, 1, 1, 1, 1, 1, 1,
243
- 1, 1, 1, 1, 1, 1, 1, 1,
244
- 1, 1, 1, 1, 1, 1, 1, 1,
245
- 1, 1, 1, 1, 1, 1, 1, 1,
246
- 1, 1, 1, 1, 1, 1, 1, 1,
247
- 1, 1, 1, 1, 1, 1, 1, 1,
248
- 1, 1, 1, 1, 1, 1, 1, 1,
249
- 1, 1, 1, 1, 1, 1, 1, 1,
250
- 1, 1, 1, 1, 1, 1, 1, 1,
251
- 1, 1, 1, 1, 1, 1, 1, 1,
252
- 1, 1, 1, 1, 1, 1, 1, 1,
253
- 1, 1, 1, 1, 1, 1, 1, 1,
254
- 1, 1, 1, 1, 1, 1, 1, 1,
255
- 45, 51, 51, 51, 51, 51, 51, 51,
256
- 1, 1, 51, 51, 51, 51, 51, 1,
257
- 51, 51, 51, 51, 51, 51, 51, 51,
258
- 51, 51, 1, 52, 1, 1, 1, 1,
259
- 1, 51, 51, 51, 51, 51, 51, 51,
260
- 51, 51, 51, 51, 51, 51, 51, 51,
261
- 51, 51, 51, 51, 51, 51, 51, 51,
262
- 51, 51, 51, 1, 1, 1, 51, 51,
263
- 51, 51, 51, 51, 51, 51, 51, 51,
264
- 51, 51, 51, 51, 51, 51, 51, 51,
265
- 51, 51, 51, 51, 51, 51, 51, 51,
266
- 51, 51, 51, 51, 51, 51, 51, 1,
267
- 53, 1, 1, 1, 54, 1, 1, 1,
268
- 1, 1, 1, 1, 1, 1, 1, 1,
269
- 1, 1, 1, 1, 1, 1, 1, 53,
270
- 1, 1, 1, 1, 1, 1, 1, 55,
271
- 1, 1, 1, 1, 1, 1, 1, 1,
272
- 1, 1, 1, 1, 1, 1, 1, 1,
273
- 1, 1, 56, 1, 57, 1, 1, 1,
274
- 58, 1, 1, 1, 1, 1, 1, 1,
275
- 1, 1, 1, 1, 1, 1, 1, 1,
276
- 1, 1, 1, 57, 1, 1, 1, 1,
277
- 1, 1, 1, 59, 1, 1, 1, 1,
278
- 1, 1, 1, 1, 1, 1, 1, 1,
279
- 1, 1, 1, 1, 1, 1, 60, 1,
280
- 61, 1, 1, 1, 62, 1, 1, 1,
281
- 1, 1, 1, 1, 1, 1, 1, 1,
282
- 1, 1, 1, 1, 1, 1, 1, 61,
283
- 63, 1, 63, 63, 63, 63, 63, 64,
284
- 1, 63, 63, 63, 63, 63, 1, 63,
285
- 63, 63, 63, 63, 63, 63, 63, 63,
286
- 63, 1, 56, 1, 63, 1, 1, 1,
287
- 63, 63, 63, 63, 63, 63, 63, 63,
288
- 63, 63, 63, 63, 63, 63, 63, 63,
289
- 63, 63, 63, 63, 63, 63, 63, 63,
290
- 63, 63, 1, 1, 1, 63, 63, 63,
291
- 63, 63, 63, 63, 63, 63, 63, 63,
292
- 63, 63, 63, 63, 63, 63, 63, 63,
293
- 63, 63, 63, 63, 63, 63, 63, 63,
294
- 63, 63, 63, 63, 63, 63, 1, 35,
295
- 1, 1, 1, 65, 1, 1, 1, 1,
296
- 1, 1, 1, 1, 1, 1, 1, 1,
297
- 1, 1, 1, 1, 1, 1, 35, 1,
298
362
  1, 1, 1, 1, 1, 1, 66, 1,
299
- 1, 1, 1, 1, 1, 1, 1, 1,
300
- 1, 1, 1, 1, 1, 1, 1, 1,
301
- 1, 2, 1, 67, 1, 1, 1, 68,
302
- 1, 1, 1, 1, 1, 1, 1, 1,
303
- 1, 1, 1, 1, 1, 1, 1, 1,
304
- 1, 1, 67, 1, 1, 1, 1, 1,
305
- 1, 1, 69, 1, 1, 1, 1, 1,
306
- 1, 1, 1, 1, 1, 1, 1, 1,
307
- 1, 1, 1, 1, 1, 36, 1, 1,
308
- 0
363
+ 66, 66, 66, 66, 66, 66, 66, 66,
364
+ 66, 66, 66, 66, 66, 66, 66, 66,
365
+ 66, 66, 66, 66, 66, 66, 66, 66,
366
+ 66, 66, 66, 66, 66, 66, 66, 66,
367
+ 66, 66, 66, 66, 66, 66, 66, 66,
368
+ 66, 66, 66, 66, 66, 66, 66, 66,
369
+ 66, 66, 66, 66, 66, 66, 66, 66,
370
+ 66, 66, 66, 66, 66, 66, 66, 66,
371
+ 66, 66, 66, 66, 66, 66, 66, 66,
372
+ 66, 66, 66, 66, 66, 66, 66, 66,
373
+ 66, 66, 66, 66, 66, 66, 66, 66,
374
+ 66, 66, 66, 66, 66, 66, 66, 66,
375
+ 66, 66, 66, 66, 66, 66, 66, 66,
376
+ 66, 66, 66, 66, 66, 66, 66, 66,
377
+ 66, 66, 66, 66, 66, 66, 66, 66,
378
+ 66, 66, 66, 66, 66, 66, 66, 66,
379
+ 1, 1, 1, 1, 1, 1, 1, 1,
380
+ 1, 1, 1, 1, 1, 1, 1, 1,
381
+ 1, 1, 1, 1, 1, 1, 1, 1,
382
+ 1, 1, 1, 1, 1, 1, 1, 1,
383
+ 1, 1, 1, 1, 1, 1, 1, 1,
384
+ 1, 1, 1, 1, 1, 1, 1, 1,
385
+ 1, 1, 1, 1, 1, 1, 1, 1,
386
+ 1, 1, 1, 1, 1, 1, 1, 1,
387
+ 1, 1, 71, 71, 71, 71, 71, 71,
388
+ 71, 71, 71, 71, 71, 71, 71, 71,
389
+ 71, 71, 71, 71, 71, 71, 71, 71,
390
+ 71, 71, 71, 71, 71, 71, 71, 71,
391
+ 72, 73, 73, 73, 73, 73, 73, 73,
392
+ 73, 73, 73, 73, 73, 74, 73, 73,
393
+ 75, 76, 76, 76, 77, 1, 66, 66,
394
+ 66, 66, 66, 66, 66, 66, 66, 66,
395
+ 66, 66, 66, 66, 66, 66, 66, 66,
396
+ 66, 66, 66, 66, 66, 66, 66, 66,
397
+ 66, 66, 66, 66, 66, 66, 66, 66,
398
+ 66, 66, 66, 66, 66, 66, 66, 66,
399
+ 66, 66, 66, 66, 66, 66, 66, 66,
400
+ 66, 66, 66, 66, 66, 66, 66, 66,
401
+ 66, 66, 66, 66, 66, 66, 1, 71,
402
+ 71, 71, 71, 71, 71, 71, 71, 71,
403
+ 71, 71, 71, 71, 71, 71, 71, 71,
404
+ 71, 71, 71, 71, 71, 71, 71, 71,
405
+ 71, 71, 71, 71, 71, 71, 71, 1,
406
+ 71, 71, 71, 71, 71, 71, 71, 71,
407
+ 71, 71, 71, 71, 71, 71, 71, 71,
408
+ 71, 71, 71, 71, 71, 71, 71, 71,
409
+ 71, 71, 71, 71, 71, 71, 71, 71,
410
+ 71, 71, 71, 71, 71, 71, 71, 71,
411
+ 71, 71, 71, 71, 71, 71, 71, 71,
412
+ 71, 71, 71, 71, 71, 71, 71, 71,
413
+ 71, 71, 71, 71, 71, 71, 71, 71,
414
+ 1, 71, 71, 71, 71, 71, 71, 71,
415
+ 71, 71, 71, 71, 71, 71, 71, 71,
416
+ 71, 71, 71, 71, 71, 71, 71, 71,
417
+ 71, 71, 71, 71, 71, 71, 71, 71,
418
+ 71, 1, 73, 73, 73, 73, 73, 73,
419
+ 73, 73, 73, 73, 73, 73, 73, 73,
420
+ 73, 73, 73, 73, 73, 73, 73, 73,
421
+ 73, 73, 73, 73, 73, 73, 73, 73,
422
+ 73, 73, 73, 73, 73, 73, 73, 73,
423
+ 73, 73, 73, 73, 73, 73, 73, 73,
424
+ 73, 73, 1, 73, 73, 73, 73, 73,
425
+ 73, 73, 73, 73, 73, 73, 73, 73,
426
+ 73, 73, 73, 73, 73, 73, 73, 73,
427
+ 73, 73, 73, 73, 73, 73, 73, 73,
428
+ 73, 73, 73, 73, 73, 73, 73, 73,
429
+ 73, 73, 73, 73, 73, 73, 73, 73,
430
+ 73, 73, 73, 73, 73, 73, 73, 73,
431
+ 73, 73, 73, 73, 73, 73, 73, 73,
432
+ 73, 73, 73, 1, 73, 73, 73, 73,
433
+ 73, 73, 73, 73, 73, 73, 73, 73,
434
+ 73, 73, 73, 73, 1, 79, 79, 79,
435
+ 79, 79, 79, 79, 1, 1, 79, 79,
436
+ 79, 79, 79, 1, 79, 79, 79, 79,
437
+ 79, 79, 79, 79, 79, 79, 1, 80,
438
+ 1, 1, 1, 1, 1, 79, 79, 79,
439
+ 79, 79, 79, 79, 79, 79, 79, 79,
440
+ 79, 79, 79, 79, 79, 79, 79, 79,
441
+ 79, 79, 79, 79, 79, 79, 79, 1,
442
+ 1, 1, 79, 79, 79, 79, 79, 79,
443
+ 79, 79, 79, 79, 79, 79, 79, 79,
444
+ 79, 79, 79, 79, 79, 79, 79, 79,
445
+ 79, 79, 79, 79, 79, 79, 79, 79,
446
+ 79, 79, 79, 1, 81, 1, 1, 1,
447
+ 82, 1, 1, 1, 1, 1, 1, 1,
448
+ 1, 1, 1, 1, 1, 1, 1, 1,
449
+ 1, 1, 1, 81, 1, 1, 1, 1,
450
+ 1, 1, 1, 83, 1, 1, 1, 1,
451
+ 1, 1, 1, 1, 1, 1, 1, 1,
452
+ 1, 1, 1, 1, 1, 1, 84, 1,
453
+ 85, 1, 1, 1, 86, 1, 1, 1,
454
+ 1, 1, 1, 1, 1, 1, 1, 1,
455
+ 1, 1, 1, 1, 1, 1, 1, 85,
456
+ 1, 1, 1, 1, 1, 1, 1, 87,
457
+ 1, 1, 1, 1, 1, 1, 1, 1,
458
+ 1, 1, 1, 1, 1, 1, 1, 1,
459
+ 1, 1, 88, 1, 89, 1, 1, 1,
460
+ 90, 1, 1, 1, 1, 1, 1, 1,
461
+ 1, 1, 1, 1, 1, 1, 1, 1,
462
+ 1, 1, 1, 89, 91, 1, 91, 91,
463
+ 91, 91, 91, 92, 1, 91, 91, 91,
464
+ 91, 91, 1, 91, 91, 91, 91, 91,
465
+ 91, 91, 91, 91, 91, 1, 84, 1,
466
+ 91, 1, 1, 1, 91, 91, 91, 91,
467
+ 91, 91, 91, 91, 91, 91, 91, 91,
468
+ 91, 91, 91, 91, 91, 91, 91, 91,
469
+ 91, 91, 91, 91, 91, 91, 1, 1,
470
+ 1, 91, 91, 91, 91, 91, 91, 91,
471
+ 91, 91, 91, 91, 91, 91, 91, 91,
472
+ 91, 91, 91, 91, 91, 91, 91, 91,
473
+ 91, 91, 91, 91, 91, 91, 91, 91,
474
+ 91, 91, 1, 49, 1, 1, 1, 93,
475
+ 1, 1, 1, 1, 1, 1, 1, 1,
476
+ 1, 1, 1, 1, 1, 1, 1, 1,
477
+ 1, 1, 49, 1, 1, 1, 1, 1,
478
+ 1, 1, 94, 1, 1, 1, 1, 1,
479
+ 1, 1, 1, 1, 1, 1, 1, 1,
480
+ 1, 1, 1, 1, 1, 2, 1, 95,
481
+ 1, 1, 1, 96, 1, 1, 1, 1,
482
+ 1, 1, 1, 1, 1, 1, 1, 1,
483
+ 1, 1, 1, 1, 1, 1, 95, 1,
484
+ 1, 1, 1, 1, 1, 1, 97, 1,
485
+ 1, 1, 1, 1, 1, 1, 1, 1,
486
+ 1, 1, 1, 1, 1, 1, 1, 1,
487
+ 1, 50, 1, 1, 0
309
488
  ]
310
489
 
311
490
  class << self
@@ -313,15 +492,19 @@ class << self
313
492
  private :_trans_targs, :_trans_targs=
314
493
  end
315
494
  self._trans_targs = [
316
- 26, 0, 2, 3, 5, 20, 4, 5,
317
- 6, 7, 8, 29, 10, 17, 7, 8,
318
- 10, 17, 9, 11, 12, 27, 16, 11,
319
- 12, 27, 16, 13, 15, 27, 7, 8,
320
- 10, 17, 19, 30, 2, 3, 5, 20,
321
- 22, 23, 22, 32, 25, 22, 23, 22,
322
- 32, 25, 24, 26, 2, 27, 14, 28,
323
- 2, 27, 14, 28, 2, 30, 18, 29,
324
- 31, 18, 31, 30, 18, 31
495
+ 40, 0, 2, 3, 5, 27, 4, 5,
496
+ 6, 7, 8, 43, 10, 24, 7, 8,
497
+ 10, 24, 9, 11, 12, 41, 16, 17,
498
+ 18, 19, 20, 21, 22, 23, 11, 12,
499
+ 41, 16, 17, 18, 19, 20, 21, 22,
500
+ 23, 13, 15, 41, 7, 8, 10, 24,
501
+ 26, 44, 2, 3, 5, 27, 29, 30,
502
+ 29, 46, 32, 33, 34, 35, 36, 37,
503
+ 38, 39, 29, 30, 29, 46, 32, 33,
504
+ 34, 35, 36, 37, 38, 39, 31, 40,
505
+ 2, 41, 14, 42, 2, 41, 14, 42,
506
+ 2, 44, 25, 43, 45, 25, 45, 44,
507
+ 25, 45
325
508
  ]
326
509
 
327
510
  class << self
@@ -331,13 +514,17 @@ end
331
514
  self._trans_actions = [
332
515
  1, 0, 0, 0, 2, 3, 0, 0,
333
516
  4, 5, 5, 5, 5, 6, 0, 0,
334
- 0, 3, 0, 7, 7, 8, 7, 0,
335
- 0, 9, 0, 0, 0, 0, 10, 10,
336
- 10, 11, 0, 0, 10, 10, 12, 11,
337
- 13, 13, 14, 15, 13, 0, 0, 3,
338
- 16, 0, 0, 0, 17, 18, 18, 19,
339
- 18, 20, 20, 21, 20, 18, 18, 0,
340
- 22, 0, 3, 10, 10, 11
517
+ 0, 3, 0, 7, 7, 8, 7, 7,
518
+ 7, 7, 7, 7, 7, 7, 0, 0,
519
+ 9, 0, 0, 0, 0, 0, 0, 0,
520
+ 0, 0, 0, 0, 10, 10, 10, 11,
521
+ 0, 0, 10, 10, 12, 11, 13, 13,
522
+ 14, 15, 13, 13, 13, 13, 13, 13,
523
+ 13, 13, 0, 0, 3, 16, 0, 0,
524
+ 0, 0, 0, 0, 0, 0, 0, 0,
525
+ 17, 18, 18, 19, 18, 20, 20, 21,
526
+ 20, 18, 18, 0, 22, 0, 3, 10,
527
+ 10, 11
341
528
  ]
342
529
 
343
530
  class << self
@@ -348,8 +535,9 @@ self._eof_actions = [
348
535
  0, 0, 0, 0, 0, 0, 0, 0,
349
536
  0, 0, 0, 0, 0, 0, 0, 0,
350
537
  0, 0, 0, 0, 0, 0, 0, 0,
351
- 0, 0, 17, 18, 20, 18, 0, 10,
352
- 0
538
+ 0, 0, 0, 0, 0, 0, 0, 0,
539
+ 0, 0, 0, 0, 0, 0, 0, 0,
540
+ 17, 18, 20, 18, 0, 10, 0
353
541
  ]
354
542
 
355
543
  class << self
@@ -359,7 +547,7 @@ self.start = 1;
359
547
  class << self
360
548
  attr_accessor :first_final
361
549
  end
362
- self.first_final = 26;
550
+ self.first_final = 40;
363
551
  class << self
364
552
  attr_accessor :error
365
553
  end
@@ -368,7 +556,7 @@ self.error = 0;
368
556
  class << self
369
557
  attr_accessor :en_comment_tail
370
558
  end
371
- self.en_comment_tail = 21;
559
+ self.en_comment_tail = 28;
372
560
  class << self
373
561
  attr_accessor :en_main
374
562
  end
@@ -377,6 +565,8 @@ self.en_main = 1;
377
565
 
378
566
 
379
567
  def self.parse(data)
568
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
569
+
380
570
  content_disposition = ContentDispositionStruct.new('', [])
381
571
  return content_disposition if Mail::Utilities.blank?(data)
382
572
 
@@ -438,19 +628,19 @@ begin
438
628
  disp_type_s = p end
439
629
  when 17 then
440
630
  begin
441
- content_disposition.disposition_type = data[disp_type_s..(p-1)].downcase end
631
+ content_disposition.disposition_type = chars(data, disp_type_s, p-1).downcase end
442
632
  when 2 then
443
633
  begin
444
634
  param_attr_s = p end
445
635
  when 4 then
446
636
  begin
447
- param_attr = data[param_attr_s..(p-1)] end
637
+ param_attr = chars(data, param_attr_s, p-1) end
448
638
  when 7 then
449
639
  begin
450
640
  qstr_s = p end
451
641
  when 9 then
452
642
  begin
453
- qstr = data[qstr_s..(p-1)] end
643
+ qstr = chars(data, qstr_s, p-1) end
454
644
  when 5 then
455
645
  begin
456
646
  param_val_s = p end
@@ -462,7 +652,7 @@ begin
462
652
  end
463
653
 
464
654
  # Use quoted string value if one exists, otherwise use parameter value
465
- value = qstr || data[param_val_s..(p-1)]
655
+ value = qstr || chars(data, param_val_s, p-1)
466
656
 
467
657
  content_disposition.parameters << { param_attr => value }
468
658
  param_attr = nil
@@ -479,7 +669,7 @@ begin
479
669
  begin
480
670
  stack[top] = cs
481
671
  top+= 1
482
- cs = 21
672
+ cs = 28
483
673
  _goto_level = _again
484
674
  next
485
675
  end
@@ -497,7 +687,7 @@ begin
497
687
  begin
498
688
  qstr_s = p end
499
689
  begin
500
- qstr = data[qstr_s..(p-1)] end
690
+ qstr = chars(data, qstr_s, p-1) end
501
691
  when 6 then
502
692
  begin
503
693
  param_val_s = p end
@@ -505,7 +695,7 @@ begin
505
695
  begin
506
696
  stack[top] = cs
507
697
  top+= 1
508
- cs = 21
698
+ cs = 28
509
699
  _goto_level = _again
510
700
  next
511
701
  end
@@ -518,7 +708,7 @@ begin
518
708
  end
519
709
 
520
710
  # Use quoted string value if one exists, otherwise use parameter value
521
- value = qstr || data[param_val_s..(p-1)]
711
+ value = qstr || chars(data, param_val_s, p-1)
522
712
 
523
713
  content_disposition.parameters << { param_attr => value }
524
714
  param_attr = nil
@@ -528,7 +718,7 @@ begin
528
718
  begin
529
719
  stack[top] = cs
530
720
  top+= 1
531
- cs = 21
721
+ cs = 28
532
722
  _goto_level = _again
533
723
  next
534
724
  end
@@ -548,7 +738,7 @@ begin
548
738
  end
549
739
 
550
740
  # Use quoted string value if one exists, otherwise use parameter value
551
- value = qstr || data[param_val_s..(p-1)]
741
+ value = qstr || chars(data, param_val_s, p-1)
552
742
 
553
743
  content_disposition.parameters << { param_attr => value }
554
744
  param_attr = nil
@@ -561,7 +751,7 @@ begin
561
751
  begin
562
752
  stack[top] = cs
563
753
  top+= 1
564
- cs = 21
754
+ cs = 28
565
755
  _goto_level = _again
566
756
  next
567
757
  end
@@ -573,7 +763,7 @@ begin
573
763
  begin
574
764
  stack[top] = cs
575
765
  top+= 1
576
- cs = 21
766
+ cs = 28
577
767
  _goto_level = _again
578
768
  next
579
769
  end
@@ -594,7 +784,7 @@ begin
594
784
  begin
595
785
  stack[top] = cs
596
786
  top+= 1
597
- cs = 21
787
+ cs = 28
598
788
  _goto_level = _again
599
789
  next
600
790
  end
@@ -606,7 +796,7 @@ begin
606
796
  end
607
797
 
608
798
  # Use quoted string value if one exists, otherwise use parameter value
609
- value = qstr || data[param_val_s..(p-1)]
799
+ value = qstr || chars(data, param_val_s, p-1)
610
800
 
611
801
  content_disposition.parameters << { param_attr => value }
612
802
  param_attr = nil
@@ -619,7 +809,7 @@ begin
619
809
  begin
620
810
  stack[top] = cs
621
811
  top+= 1
622
- cs = 21
812
+ cs = 28
623
813
  _goto_level = _again
624
814
  next
625
815
  end
@@ -631,7 +821,7 @@ begin
631
821
  end
632
822
 
633
823
  # Use quoted string value if one exists, otherwise use parameter value
634
- value = qstr || data[param_val_s..(p-1)]
824
+ value = qstr || chars(data, param_val_s, p-1)
635
825
 
636
826
  content_disposition.parameters << { param_attr => value }
637
827
  param_attr = nil
@@ -656,7 +846,7 @@ begin
656
846
  case _eof_actions[cs]
657
847
  when 17 then
658
848
  begin
659
- content_disposition.disposition_type = data[disp_type_s..(p-1)].downcase end
849
+ content_disposition.disposition_type = chars(data, disp_type_s, p-1).downcase end
660
850
  when 18 then
661
851
  begin
662
852
 
@@ -665,7 +855,7 @@ begin
665
855
  end
666
856
 
667
857
  # Use quoted string value if one exists, otherwise use parameter value
668
- value = qstr || data[param_val_s..(p-1)]
858
+ value = qstr || chars(data, param_val_s, p-1)
669
859
 
670
860
  content_disposition.parameters << { param_attr => value }
671
861
  param_attr = nil
@@ -684,7 +874,7 @@ begin
684
874
  end
685
875
 
686
876
  # Use quoted string value if one exists, otherwise use parameter value
687
- value = qstr || data[param_val_s..(p-1)]
877
+ value = qstr || chars(data, param_val_s, p-1)
688
878
 
689
879
  content_disposition.parameters << { param_attr => value }
690
880
  param_attr = nil
@@ -701,8 +891,8 @@ end
701
891
  end
702
892
 
703
893
 
704
- if p != eof || cs < 26
705
- raise Mail::Field::ParseError.new(Mail::ContentDispositionElement, data, "Only able to parse up to #{data[0..p]}")
894
+ if p != eof || cs < 40
895
+ raise Mail::Field::IncompleteParseError.new(Mail::ContentDispositionElement, data, p)
706
896
  end
707
897
 
708
898
  content_disposition