Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

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}