Fork of daniellemaywood.uk/gleam — Wasm codegen work
18 kB
378 lines
1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2026 The Gleam contributors
3
4//// We want to test all of these functions against the actual values produced by
5//// Erlang when turning some data into a binary.
6////
7//// All the bytes you see in the assertions here were produced using the
8//// following bit of Erlang:
9////
10//// ```erl
11//// Binary = term_to_binary(SomeErlangData),
12//// io:format("~w~n", [Binary]).
13//// ```
14////
15//// This will turn any data structure into its binary representation and print
16//// its bytes we can then copy paste in these tests.
17////
18//// For example: if I were to test that a list of two atoms is correctly turned
19//// into its binary representation I would write the following:
20////
21//// ```erl
22//// Binary = term_to_binary([nil, ok]),
23//// io:format("~w~n", [Binary]).
24//// ```
25////
26//// And write a test like this:
27////
28//// ```ignore
29//// let mut etf = Builder::new();
30//// let list = etf.start_list();
31//// etf.atom("nil");
32//// etf.atom("ok");
33//// etf.end_list(list, 2);
34////
35//// assert_eq!(
36//// etf.into_vec(),
37//// [... the bytes I got from the Erlang code ...]
38//// )
39//// ```
40////
41use std::{ops::Neg, str::FromStr};
42
43use num_bigint::BigInt;
44
45use crate::TermBuilder;
46
47#[test]
48fn small_atom() {
49 let mut etf = TermBuilder::new();
50 etf.atom("atom");
51 assert_eq!(etf.into_vec(), [131, 119, 4, 97, 116, 111, 109])
52}
53
54#[test]
55fn small_atom_utf8() {
56 let mut etf = TermBuilder::new();
57 etf.atom("ksiąskę");
58 assert_eq!(
59 etf.into_vec(),
60 [131, 119, 9, 107, 115, 105, 196, 133, 115, 107, 196, 153]
61 )
62}
63
64#[test]
65fn atom() {
66 let mut etf = TermBuilder::new();
67 etf.atom(&"ą".repeat(128));
68 assert_eq!(
69 etf.into_vec(),
70 [
71 131, 118, 1, 0, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133,
72 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196,
73 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133,
74 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196,
75 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133,
76 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196,
77 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133,
78 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196,
79 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133,
80 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196,
81 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133,
82 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196,
83 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133,
84 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196,
85 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133, 196, 133,
86 196, 133, 196, 133
87 ]
88 )
89}
90
91#[test]
92fn small_integer() {
93 let mut etf = TermBuilder::new();
94 etf.small_integer(1);
95 assert_eq!(etf.into_vec(), [131, 97, 1]);
96}
97
98#[test]
99fn integer() {
100 let mut etf = TermBuilder::new();
101 etf.integer(-2);
102 assert_eq!(etf.into_vec(), [131, 98, 255, 255, 255, 254]);
103}
104
105#[test]
106fn integer_2() {
107 let mut etf = TermBuilder::new();
108 etf.integer(1048576);
109 assert_eq!(etf.into_vec(), [131, 98, 0, 16, 0, 0]);
110}
111
112#[test]
113fn float() {
114 let mut etf = TermBuilder::new();
115 etf.new_float(1.2);
116 assert_eq!(etf.into_vec(), [131, 70, 63, 243, 51, 51, 51, 51, 51, 51])
117}
118
119#[test]
120fn small_big() {
121 let mut etf = TermBuilder::new();
122
123 etf.small_big(BigInt::from(123123123123123123 as i64));
124 assert_eq!(
125 etf.into_vec(),
126 [131, 110, 8, 0, 179, 243, 99, 1, 212, 107, 181, 1]
127 );
128}
129
130#[test]
131fn negative_small_big() {
132 let mut etf = TermBuilder::new();
133 etf.small_big(BigInt::from(-123123123123123123 as i64));
134 assert_eq!(
135 etf.into_vec(),
136 [131, 110, 8, 1, 179, 243, 99, 1, 212, 107, 181, 1]
137 );
138}
139
140#[test]
141fn empty_list() {
142 let mut etf = TermBuilder::new();
143 etf.empty_list();
144 assert_eq!(etf.into_vec(), [131, 106]);
145}
146
147#[test]
148fn proper_list_with_a_single_item() {
149 let mut etf = TermBuilder::new();
150 let list = etf.start_list();
151 etf.small_integer(1);
152 etf.end_list(list, 1);
153 assert_eq!(etf.into_vec(), [131, 108, 0, 0, 0, 1, 97, 1, 106])
154}
155
156#[test]
157fn proper_list() {
158 let mut etf = TermBuilder::new();
159 let list = etf.start_list();
160 etf.small_integer(1);
161 etf.small_tuple(0);
162 etf.small_integer(2);
163 etf.end_list(list, 3);
164 assert_eq!(
165 etf.into_vec(),
166 [131, 108, 0, 0, 0, 3, 97, 1, 104, 0, 97, 2, 106]
167 )
168}
169
170#[test]
171fn empty_binary() {
172 let mut etf = TermBuilder::new();
173 etf.binary(0, vec![]);
174 assert_eq!(etf.into_vec(), [131, 109, 0, 0, 0, 0])
175}
176#[test]
177fn binary() {
178 let mut etf = TermBuilder::new();
179 etf.binary(3, vec![1, 2, 3]);
180 assert_eq!(etf.into_vec(), [131, 109, 0, 0, 0, 3, 1, 2, 3])
181}
182
183#[test]
184fn small_empty_tuple() {
185 let mut etf = TermBuilder::new();
186 etf.small_tuple(0);
187 assert_eq!(etf.into_vec(), [131, 104, 0])
188}
189
190#[test]
191fn small_single_item_tuple() {
192 let mut etf = TermBuilder::new();
193 etf.small_tuple(1);
194 etf.small_integer(1);
195 assert_eq!(etf.into_vec(), [131, 104, 1, 97, 1])
196}
197
198#[test]
199fn small_tuple() {
200 let mut etf = TermBuilder::new();
201 etf.small_tuple(3);
202 etf.new_float(1.1);
203 etf.integer(-1);
204 etf.small_integer(11);
205
206 assert_eq!(
207 etf.into_vec(),
208 [
209 131, 104, 3, 70, 63, 241, 153, 153, 153, 153, 153, 154, 98, 255, 255, 255, 255, 97, 11
210 ]
211 )
212}
213
214#[test]
215fn small_nested_tuple() {
216 let mut etf = TermBuilder::new();
217 etf.small_tuple(2);
218
219 etf.small_tuple(2);
220 etf.small_integer(1);
221 etf.small_integer(11);
222
223 etf.small_tuple(1);
224 etf.new_float(1.1);
225
226 assert_eq!(
227 etf.into_vec(),
228 [
229 131, 104, 2, 104, 2, 97, 1, 97, 11, 104, 1, 70, 63, 241, 153, 153, 153, 153, 153, 154
230 ]
231 )
232}
233
234#[test]
235fn large_tuple() {
236 let mut etf = TermBuilder::new();
237 etf.large_tuple(500);
238 for _ in 1..=500 {
239 etf.small_integer(1);
240 }
241
242 assert_eq!(
243 etf.into_vec(),
244 [
245 131, 105, 0, 0, 1, 244, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
246 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
247 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
248 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
249 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
250 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
251 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
252 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
253 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
254 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
255 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
256 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
257 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
258 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
259 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
260 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
261 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
262 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
263 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
264 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
265 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
266 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
267 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
268 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
269 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
270 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
271 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
272 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
273 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
274 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
275 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
276 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
277 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
278 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
279 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
280 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
281 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
282 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
283 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1,
284 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97,
285 1, 97, 1, 97, 1, 97, 1
286 ]
287 )
288}
289
290#[test]
291fn large_big() {
292 let mut etf = TermBuilder::new();
293 etf.large_big(BigInt::from_str(&"1".repeat(1500)).unwrap());
294 assert_eq!(
295 etf.into_vec(),
296 [
297 131, 111, 0, 0, 2, 111, 0, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
298 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
299 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
300 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
301 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
302 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
303 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
304 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
305 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
306 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
307 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 1, 169, 242, 20, 147, 190, 32,
308 128, 194, 36, 247, 163, 33, 20, 52, 44, 99, 21, 192, 66, 245, 84, 128, 97, 156, 59, 26,
309 49, 215, 19, 60, 165, 65, 99, 28, 91, 91, 132, 187, 191, 48, 27, 217, 244, 127, 22,
310 229, 191, 10, 184, 4, 38, 105, 182, 90, 90, 141, 23, 179, 148, 140, 187, 169, 145, 218,
311 132, 199, 136, 139, 1, 228, 120, 218, 220, 103, 20, 164, 155, 60, 1, 158, 242, 71, 1,
312 60, 69, 6, 13, 244, 52, 42, 222, 129, 25, 127, 251, 133, 199, 37, 61, 61, 94, 35, 52,
313 38, 9, 114, 0, 173, 92, 189, 59, 8, 14, 253, 129, 64, 238, 18, 222, 214, 221, 45, 236,
314 250, 62, 255, 237, 241, 149, 145, 143, 93, 41, 2, 156, 28, 29, 102, 103, 8, 227, 146,
315 128, 117, 183, 231, 113, 20, 148, 190, 253, 95, 114, 208, 224, 186, 125, 28, 74, 117,
316 131, 197, 189, 238, 208, 96, 253, 134, 27, 108, 58, 63, 97, 183, 248, 49, 174, 205, 42,
317 129, 196, 241, 71, 237, 83, 136, 127, 61, 225, 107, 199, 146, 30, 212, 53, 215, 141,
318 147, 198, 3, 37, 170, 175, 29, 43, 85, 98, 73, 198, 113, 9, 121, 149, 228, 107, 200,
319 16, 159, 117, 150, 91, 90, 121, 11, 5, 27, 25, 110, 69, 194, 57, 21, 91, 173, 149, 40,
320 5, 126, 101, 113, 247, 14, 130, 154, 249, 36, 143, 183, 129, 4, 174, 108, 164, 122, 95,
321 105, 77, 243, 58, 158, 223, 166, 79, 103, 131, 161, 110, 57, 79, 214, 142, 141, 39,
322 101, 6, 176, 22, 182, 89, 247, 229, 80, 244, 24, 62, 101, 128, 174, 253, 86, 233, 138,
323 130, 115, 157, 80, 21, 83, 187, 222, 43, 19, 105, 97, 230, 7, 167, 25, 6, 69, 207, 149,
324 32, 199, 44, 85, 27, 223, 133, 46, 234, 3, 59, 113, 228, 246, 29, 157, 4, 83, 207, 234,
325 85, 122, 148, 64, 125, 49, 48, 123, 226, 213, 154, 212, 102, 6, 154, 91, 67, 242, 232,
326 99, 154, 238, 73, 72, 122, 170, 27, 110, 83, 110, 146, 159, 87, 87, 163, 151, 196, 47,
327 134, 198, 170, 197, 189, 176, 82, 247, 130, 95, 159, 217, 228, 52, 214, 63, 247, 169,
328 152, 216, 23, 182, 142, 26, 218, 248, 47, 161, 238, 180, 122, 54, 239, 38, 95, 65, 114,
329 128, 93, 233, 71, 177, 101, 2, 236, 244, 88, 249, 104, 210, 4, 249, 5, 172, 107, 216,
330 222, 165, 242, 106, 222, 22, 158, 50, 13
331 ]
332 );
333}
334
335#[test]
336fn negative_large_big() {
337 let mut etf = TermBuilder::new();
338 etf.large_big(BigInt::from_str(&"1".repeat(1500)).unwrap().neg());
339 assert_eq!(
340 etf.into_vec(),
341 [
342 131, 111, 0, 0, 2, 111, 1, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
343 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
344 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
345 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
346 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
347 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
348 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
349 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
350 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
351 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199,
352 113, 28, 199, 113, 28, 199, 113, 28, 199, 113, 28, 199, 1, 169, 242, 20, 147, 190, 32,
353 128, 194, 36, 247, 163, 33, 20, 52, 44, 99, 21, 192, 66, 245, 84, 128, 97, 156, 59, 26,
354 49, 215, 19, 60, 165, 65, 99, 28, 91, 91, 132, 187, 191, 48, 27, 217, 244, 127, 22,
355 229, 191, 10, 184, 4, 38, 105, 182, 90, 90, 141, 23, 179, 148, 140, 187, 169, 145, 218,
356 132, 199, 136, 139, 1, 228, 120, 218, 220, 103, 20, 164, 155, 60, 1, 158, 242, 71, 1,
357 60, 69, 6, 13, 244, 52, 42, 222, 129, 25, 127, 251, 133, 199, 37, 61, 61, 94, 35, 52,
358 38, 9, 114, 0, 173, 92, 189, 59, 8, 14, 253, 129, 64, 238, 18, 222, 214, 221, 45, 236,
359 250, 62, 255, 237, 241, 149, 145, 143, 93, 41, 2, 156, 28, 29, 102, 103, 8, 227, 146,
360 128, 117, 183, 231, 113, 20, 148, 190, 253, 95, 114, 208, 224, 186, 125, 28, 74, 117,
361 131, 197, 189, 238, 208, 96, 253, 134, 27, 108, 58, 63, 97, 183, 248, 49, 174, 205, 42,
362 129, 196, 241, 71, 237, 83, 136, 127, 61, 225, 107, 199, 146, 30, 212, 53, 215, 141,
363 147, 198, 3, 37, 170, 175, 29, 43, 85, 98, 73, 198, 113, 9, 121, 149, 228, 107, 200,
364 16, 159, 117, 150, 91, 90, 121, 11, 5, 27, 25, 110, 69, 194, 57, 21, 91, 173, 149, 40,
365 5, 126, 101, 113, 247, 14, 130, 154, 249, 36, 143, 183, 129, 4, 174, 108, 164, 122, 95,
366 105, 77, 243, 58, 158, 223, 166, 79, 103, 131, 161, 110, 57, 79, 214, 142, 141, 39,
367 101, 6, 176, 22, 182, 89, 247, 229, 80, 244, 24, 62, 101, 128, 174, 253, 86, 233, 138,
368 130, 115, 157, 80, 21, 83, 187, 222, 43, 19, 105, 97, 230, 7, 167, 25, 6, 69, 207, 149,
369 32, 199, 44, 85, 27, 223, 133, 46, 234, 3, 59, 113, 228, 246, 29, 157, 4, 83, 207, 234,
370 85, 122, 148, 64, 125, 49, 48, 123, 226, 213, 154, 212, 102, 6, 154, 91, 67, 242, 232,
371 99, 154, 238, 73, 72, 122, 170, 27, 110, 83, 110, 146, 159, 87, 87, 163, 151, 196, 47,
372 134, 198, 170, 197, 189, 176, 82, 247, 130, 95, 159, 217, 228, 52, 214, 63, 247, 169,
373 152, 216, 23, 182, 142, 26, 218, 248, 47, 161, 238, 180, 122, 54, 239, 38, 95, 65, 114,
374 128, 93, 233, 71, 177, 101, 2, 236, 244, 88, 249, 104, 210, 4, 249, 5, 172, 107, 216,
375 222, 165, 242, 106, 222, 22, 158, 50, 13
376 ]
377 );
378}